2016暑期ACM学习
1045-黑白棋
url=http://acm.xidian.edu.cn/problem.php?id=1045&appkey=&title=&pic=&ralateUid=&language=zh_cn#_loginLayer_1475648650717)
#include<stdio.h>
int c[6][6];
int fi[5]={0,-1,1,0,0};
int fj[5]={0,0,0,-1,1};
bool can(int i,int j)
{
if(i<1||j<1||i>5||j>5||c[i][j])
return false;
return true;
}
bool dfs(int i,int j)
{
c[i][j]=1;
int ni,nj;
for(int k=1;k<5;k++)
{
ni=i+fi[k];
nj=j+fj[k];
if(can(ni,nj))
{
if(dfs(ni,nj))
{
c[i][j]=0;//如果先手会输则悔棋
return false;
}
}
}
c[i][j]=0;//?不理解
return true;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
bool flag=false;
for(int i=1;i<6;i++)
for(int j=1;j<6;j++)
scanf("%1d",&c[i][j]);
//第一步有多处可以下
for(int i=1;i<6;i++)
{
for(int j=1;j<6;j++)
{
if(c[i][j]==0&&dfs(i,j))
{
flag=true;
break;
}
}
}
if(flag)
printf("win\n");
else
printf("lose\n");
}
return 0;
}