组队赛2(B/G——Ancient Go)HDU - 5546 (dfs搜索)

43 篇文章 0 订阅
17 篇文章 0 订阅

Sample Input

1

.......xo
.........
.........
..x......
.xox....x
.o.o...xo
..o......
.....xxxo
....xooo.
Sample Output
Case #1: Can kill in one move!!!
Case #2: Can not kill in one move!!!



这是一个搜索的题目,之前看题的时候,一直在错,然后思考一番有个问题就是在递归的时候,会搜索回去,忘记了用一个数组标记走过的路这件事,然后会递归回去,因此写了一个比较麻烦的函数,带有递归的方向,然而还是wa,再读题之后发现还要到将对方已经死掉的字去掉,然后再将自己的死子去掉,之后再看是否能一步将敌方子杀死,经过处理之后发现交上去的还是错的,,这让我很懵逼,,,

下面是题解,他根本没有考虑  死子的问题,但是值得注意的一点事是,对于vis数组内部的存储存储数据,按道理说只需用01,0表示未走,而1表示走过就好,但是这样提交之后是错误的,这也让我很懵逼,目前还没找到错误数据


#include <iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int maxn=15;
char pan[maxn][maxn];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int vis[maxn][maxn];
int ncc;

int dfs(int x,int y)
{
    int ha=0;
    vis[x][y]=ncc;//?为何1不行
    for(int i=0;i<4;i++)
    {
        int xx=x+dx[i],yy=y+dy[i];

        if(xx<0||yy<0||xx>9||yy>9||vis[xx][yy]==ncc)
            continue;
        if(pan[xx][yy]=='.')
           {
               ha++;vis[xx][yy]=ncc;
           }
        else if(pan[xx][yy]=='o')
        {
            ha+= dfs(xx,yy);
        }
    }
    return ha;
}

bool solve()
{  ncc=0;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
      {
        if(pan[i][j]=='o')
        {   ncc++;
            if(dfs(i,j)==1)
               {
                  // cout<<i<<" "<<j<<" "<<endl;
                   return true;
               }
        }
      }
  return false;
}

int main()
{
    int T;
    cin>>T;
    int kase=0;
    while(T--)
    {
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++)
              cin>>pan[i][j];

      if(solve())
            cout<<"Case #"<<++kase<<": Can kill in one move!!!"<<endl;
            else
                cout<<"Case #"<<++kase<<": Can not kill in one move!!!"<<endl;

    }

    return 0;
}

送一串我那又臭又长的代码,并且错误了。。。。。但是还是想存一下,来给以后的自己看看

#include <iostream>
#include<cstring>
using namespace std;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
const int maxn=105;
char pan[15][15];
int nn=0;
int  jj(int x,int y,int f,char c)
{   char cc='x';
    if(c=='x')
        cc='o';
    int nx=x+dx[f],ny=y+dy[f];
     if(ny<=0||nx<=0||ny>=10||nx>=10)
         return 1;
    if(pan[nx][ny]=='.')
           return 2;
   if(pan[nx][ny]==c)
            return 1;
    if(pan[nx][ny]==cc)//cc是自己的子
      {    nn++;
           return jj(nx,ny,f,c);
      }

}
 int ch[5];
bool ju(int x,int y)
{  int have=0;

    for(int i=0;i<4;i++)
    {
            if(jj(x,y,i,'x')==2)
                have++;
                if(have>1)
                    return false;

    }

    if(have==1)
        return true;
    else
        return false;
}
bool ju2(int x,int y,char c)
{  int have=0;
   memset(ch,0,sizeof(ch));
    for(int i=0;i<4;i++)
    {    nn=0;
            if(jj(x,y,i,c)==2)
                have++;
                if(have>=1)
                    return false;
        if(nn>0)
           ch[i]=nn;
    }
    if(have==0)
       {    for(int i=0;i<4;i++ )
              for(int j=0;j<=ch[i];j++)
              {
                  int bx=x+j*dx[i],by=y+j*dy[i];
                  pan[bx][by]='.';

              }
           return true;
       }
    else
        return false;

}
void remove1()
{
    for(int i=1;i<=9;i++)
            for(int j=1;j<=9;j++)
            {
                if(pan[i][j]=='o')//dizi
                {
                    if(ju2(i,j,'x'))
                    {
                       nn=0;
                    }
                }
            }
        for(int i=1;i<=9;i++)
            for(int j=1;j<=9;j++)
            {
                if(pan[i][j]=='x')
                {
                    if(ju2(i,j,'o'))
                    {  nn=0;

                    }
                }
            }


}

bool solve()
{
    int num=0;
    for(int i=1;i<=9;i++)
            for(int j=1;j<=9;j++)
            {
                if(pan[i][j]=='o')
                {
                    if(ju(i,j)==1)
                    {
                       return true;
                    }
                }
            }

  return false;
}
int T;

int main()
{
    cin>>T;
   for(int k=1;k<=T;k++)
    {
        for(int i=1;i<=9;i++)
            for(int j=1;j<=9;j++)
              cin>>pan[i][j];
        remove1();

       if(solve())
           cout<<"Case #"<<k<<": Can kill in one move!!!"<<endl;
       else
        cout<<"Case #"<<k<<": Can not kill in one move!!!"<<endl;
    }

    return 0;
}




比较懒,下面送一组大佬的ac的代码图片,包涵kill情况的


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值