组队赛2(B/G——Ancient Go)HDU - 5546 (dfs搜索)
2017-04-05 20:26
471 查看
Sample Input
Sample Output
这是一个搜索的题目,之前看题的时候,一直在错,然后思考一番有个问题就是在递归的时候,会搜索回去,忘记了用一个数组标记走过的路这件事,然后会递归回去,因此写了一个比较麻烦的函数,带有递归的方向,然而还是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情况的
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情况的
相关文章推荐
- hdu 5546 Ancient Go【dfs】【思维】
- hdu 5546 Ancient Go(2016ccpc) 暴力DFS
- hdu 5546 Ancient Go(dfs)
- HDU 5546 Ancient Go——dfs
- HDOJ 5546 Ancient Go(qwb铜牌题 DFS搜索)
- HDU 5546 Ancient Go(DFS)
- HDU 5546 Ancient Go (dfs)
- HDU 5546 Ancient Go (dfs)
- hdu 5546 Ancient Go(dfs)
- HDU~5546 Ancient Go(暴力dfs)
- HDU 5546 Ancient Go 搜索
- hdu 5546 Ancient Go 枚举 DFS
- HDU 5546 Ancient Go (搜索)
- [HDOJ] 5546 Ancient Go [DFS]
- The 2015 China Collegiate Programming Contest G. Ancient Go hdu 5546
- hdu 5546 Ancient Go
- hdu 5546 Ancient Go(bfs+模拟)
- 2015 南阳 CCPC hdu 5546 Ancient Go(DFS,暴力)
- HDU 5546 Ancient Go (ccpc2015南阳G)
- hdu5546 Ancient Go DFS搜索 国庆咸鱼