标签:des style http color io os ar java for

31 3 3 1 3 4 0 3 5 0 3 6 0 4 4 1 4 5 1 4 7 0 5 3 0 5 4 0 5 5 1 5 6 1 5 7 1 5 9 1 6 4 1 6 5 1 6 6 0 6 7 1 6 8 0 6 9 0 7 5 1 7 6 0 7 7 1 7 8 1 7 9 0 8 5 0 8 6 1 8 7 0 8 8 1 8 9 0 9 7 1 10 8 0 1 7 7 1 1 7 7 0 0
Place white at (5,8) to win in 3 moves. Cannot win in 3 moves. Invalid.
2、判断对手是否存在两个空白格子使得他能够得到连续的5个棋子,因为这样,先手就不能堵住后手。
3、枚举任一空白格子放先手棋子,则只需对手方不存在“一空白格子使得棋子有连续的5个”,且先手方此时有"两个空白格子使得他能够得到连续的5个棋子",则先手胜。(攻防转换)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 20
const int inf=0x3fffffff;
const double eps=1e-8;
int xx,yy;
int dx[4]={0,1,1,1};
int dy[4]={1,1,0,-1};
int g[N][N];
int bfs1(int v) //判断是否存在一个空白格子使棋子连成连续的5个
{
int i,j,k,x,y,sum;
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(g[i][j]==-1)
{
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
sum=1;
while(1)
{
if(x<0||x>=15||y<0||y>=15||g[x][y]!=v)
break;
sum++;
x+=dx[k];
y+=dy[k];
}
x=i-dx[k];
y=j-dy[k];
while(1)
{
if(x<0||x>=15||y<0||y>=15||g[x][y]!=v)
break;
sum++;
x-=dx[k];
y-=dy[k];
}
if(sum>=5)
{
xx=i;yy=j;
return 1;
}
}
}
}
}
return 0;
}
int bfs2(int v) //判断是否存在2个空白格子使棋子连成连续的5个
{
int i,j,k,x,y,sum,num=0;
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(g[i][j]==-1)
{
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
sum=1;
while(1)
{
if(x<0||x>=15||y<0||y>=15||g[x][y]!=v)
break;
sum++;
x+=dx[k];
y+=dy[k];
}
x=i-dx[k];
y=j-dy[k];
while(1)
{
if(x<0||x>=15||y<0||y>=15||g[x][y]!=v)
break;
sum++;
x-=dx[k];
y-=dy[k];
}
if(sum>=5)
{
if(num==1)
return 1;
num++;
break;
}
}
}
}
}
return 0;
}
int bfs3(int v) //情况3,
{
int i,j;
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(g[i][j]==-1)
{
g[i][j]=v;
if(bfs1(1-v)==0&&bfs2(v)==1)
{
xx=i;yy=j;
return 1;
}
g[i][j]=-1;
}
}
}
return 0;
}
int main()
{
int i,n,x,y,d,w,b,val;
while(scanf("%d",&n),n)
{
memset(g,-1,sizeof(g));
w=b=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&d);
g[x][y]=d;
if(d==0)
w++;
else
b++;
}
if(w>b)
{
printf("Invalid.\n");
continue;
}
if(w==b)
val=1;
else
val=0;
if(bfs1(val))
{
if(val==0)
printf("Place white at (%d,%d) to win in 1 move.\n",xx,yy);
else
printf("Place black at (%d,%d) to win in 1 move.\n",xx,yy);
}
else if(bfs2(1-val))
printf("Lose in 2 moves.\n");
else
{
if(bfs3(val))
{
if(val==0)
printf("Place white at (%d,%d) to win in 3 moves.\n",xx,yy);
else
printf("Place black at (%d,%d) to win in 3 moves.\n",xx,yy);
}
else
printf("Cannot win in 3 moves.\n");
}
}
return 0;
}
标签:des style http color io os ar java for
原文地址:http://blog.csdn.net/u011721440/article/details/40041431