您的位置:首页 > 编程语言 > Go语言

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

2017-04-05 20:26 471 查看
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,
4000
-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情况的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: