1.题目描述:
类似于五子棋,三连则胜利,然后玩到一半朋友走了,要你判断他("x"方)是否只下一步就能赢
3.解题思路:
地图很小直接暴力对“.”的位置下x,每下一步就判断是否会胜利即可,注意回溯。判断胜利条件就是看周围八个位置是否连着,应该还可以剪枝?
4.AC代码:
#include <stdio.h>
using namespace std;
char mp[4][4];
int judge()
{
for (int i = 0; i < 4; i++) // 横着
for (int j = 0; j <= 1; j++)
if (mp[i][j] == 'x' && mp[i][j + 1] == 'x' && mp[i][j + 2] == 'x')
return 1;
for (int j = 0; j <= 1; j++) // 竖着
for (int i = 0; i < 4; i++)
if (mp[j][i] == 'x' && mp[j + 1][i] == 'x' && mp[j + 2][i] == 'x')
return 1;
for (int i = 0; i <= 1; i++) // 斜着
for (int j = 0; j <= 1; j++)
if (mp[i][j] == 'x' && mp[i + 1][j + 1] == 'x' && mp[i + 2][j + 2] == 'x')
return 1;
for (int i = 0; i <= 1; i++) // 斜着
for (int j = 2; j < 4; j++)
if (mp[i][j] == 'x' && mp[i + 1][j - 1] == 'x' && mp[i + 2][j - 2] == 'x')
return 1;
return 0;
}
int main()
{
int flag = 0;
for (int i = 0; i < 4; i++)
scanf("%s", mp[i]);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
if (mp[i][j] == '.')
{
mp[i][j] = 'x';
if (judge())
{
flag = 1;
break;
}
mp[i][j] = '.';
}
}
if (flag)
puts("YES");
else
puts("NO");
return 0;
}