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

hdu 36832010 Asia Hangzhou Regional Contest Gomoku 模拟、枚举

2011-10-28 11:56 429 查看
View Code

#include<stdio.h>
#include<string.h>
int map[20][20];
int dx[]={1,1,0,-1,-1,-1,0,1};
int dy[]={0,1,1, 1, 0,-1,-1,-1};
int len=15;
int n;
bool inside(int x,int y)
{
return (x>=1&&x<=len&&y>=1&&y<=len);
}
bool check(int man,int x,int y)
{
int dir,ex,ey,count=0,i;
for(dir=0;dir<4;dir++)
{
count=0;
for(i=1;;i++)
{
ex=x+i*dx[dir];
ey=y+i*dy[dir];
if(inside(ex,ey)&&map[ex][ey]==man) count++;
else break;
}
for(i=1;;i++)
{
ex=x+i*dx[dir+4];
ey=y+i*dy[dir+4];
if(inside(ex,ey)&&map[ex][ey]==man) count++;
else break;
}
if(count>=4)
return true;
}
return false;
}
bool canwin(int man,int &x,int &y)
{
int i,j;
for(i=1;i<=len;i++)
for(j=1;j<=len;j++)
{
if(map[i][j]) continue;
if(check(man,i,j))
{
x=i;
y=j;
return true;
}
}
return false;
}
bool candefend(int man,int &x,int &y)
{
int i,j,count=0;
for(i=1;i<=len;i++)
for(j=1;j<=len;j++)
{
if(map[i][j]) continue;
if(check(3-man,i,j))
{
count++;
if(count>1) return false;
x=i;
y=j;
}
}
return true;
}
int main()
{
int i,j,x,y,c;
char color[5][10]={"","white","black"};
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
int black=0,white=0,man;
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&c);
map[x+1][y+1]=c+1;
}
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(map[i][j]==1) white++;
if(map[i][j]==2) black++;
}
}
if(black==white) man=2;
else if(black==white+1) man=1;
else
{
printf("Invalid.\n");
continue;
}
if(canwin(man,x,y))
{
printf("Place %s at (%d,%d) to win in 1 move.\n",color[man],x-1,y-1);
continue;
}
else
{
if(!candefend(man,i,j))
{
printf("Lose in 2 moves.\n");
continue;
}
else
{
int flag=0;
for(i=1;i<=len;i++)
{
for(j=1;j<=len;j++)
{
if(map[i][j]) continue;
map[i][j]=man;
if(!canwin(3-man,x,y)&&!candefend(3-man,x,y))
{
printf("Place %s at (%d,%d) to win in 3 moves.\n",color[man],i-1,j-1);
flag=1;
break;
}
map[i][j]=0;
}
if(flag) break;
}
if(flag) continue;
printf("Cannot win in 3 moves.\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: