题目意思:
你是x方,看你再下一步,能不能把o的子吃掉一个
思路:
枚举所有 . 的点,看是否能够下吃掉对方
CODE
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
char mp[11][11];
int vis[11][11];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int xand(int x,int y)
{
if(x < 9 && x >= 0 && y <9 && y >= 0)
return 1;
else
return 0;
}
int can(int x, int y)
{
vis[x][y] = 1;
for(int i = 0; i < 4; i++)
{
int xx = dx[i]+x;
int yy = dy[i]+y;
if(vis[xx][yy]||!xand(xx,yy)) continue;
if(mp[xx][yy] == '.' || (mp[xx][yy] == 'o' && !can(xx,yy)))
return 0;
}
return 1;
}
int get(int x, int y)
{
mp[x][y] = 'x';
for(int i = 0; i < 4; i++)
{
int xx = x +dx[i];
int yy = y+dy[i];
if(xand(xx,yy)&&mp[xx][yy] == 'o')
{
memset(vis,0,sizeof(vis));
if(can(xx,yy))
return 1;
}
}
mp[x][y] = '.';
return 0;
}
int main()
{
int t;
int io = 1;
scanf("%d",&t);
while(t--)
{
int flag = 0;
for(int i = 0; i < 9; i++)
scanf("%s",mp[i]);
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(mp[i][j] == '.')
{
flag = get(i,j);
}
if(flag)
break;
}
if(flag)
break;
}
printf("Case #%d: ",io++);
if(flag)
{
printf("Can kill in one move!!!\n");
}
else
printf("Can not kill in one move!!!\n");
}
return 0;
}