这是一个棋盘的题目:
题目大意:在一个9*9的矩阵中有‘x’ ‘o’ '.‘三种字符,目的是只添加一个’x’让‘o’字符不与’.'直接相连,这里的’o’可以是一个或者是几个,也就是添加一个’x’使得’x’包围’o’
思路:输入图后遍历整个图,遇到’o’从该点进行广度优先搜索,搜索的终点是‘x’和 ‘.’ ,其中当遇到 ‘.’ 时用一个计数变量累加,搜索完后判断一共遍历到几个 ’ . ’ 。
#include <iostream>
#include <string.h>
using namespace std;
/*全局变量*/
char mp[11][11];//图
bool vis[11][11];//判断图中点是否走过
int cnt, next_x[4] = { 0,1,0,-1 }, next_y[4] = { 1,0,-1,0 };
//统计‘.’的计数变量,控制上下左右走的两个数组
/*自定义函数*/
void input();//输入数据
void bfs(int x, int y);//进行广度优先搜索
int main()
{
int t;
cin >> t;
for (int id = 1; id <= t; id++)
{
input();
bool flag;
for (int i = 1; i <= 9; i++)
{
flag = false;//标记是否找到符合题意的'o'点
for (int j = 1; j <= 9; j++)
{
if (mp[i][j] == 'o')//开始深度搜索
{
//初始化数据,每次搜索都要初始化
memset(vis, false, sizeof(vis));
cnt = 0;
bfs(i, j);
if (cnt == 1)//如果包围‘o’的字符中只有一个'.'
{
flag = true;
break;
}
}
}
if (flag)//只要找到一个符合题意的点就可以
{
printf("Case #%d: Can kill in one move!!!\n", id);
break;
}
}
if (!flag)
{
printf("Case #%d: Can not kill in one move!!!\n", id);
}
}
}
/*自定义函数*/
void input()
{
for (int i = 1; i <= 9; i++)
{
cin >> mp[i] + 1;
}
}
void bfs(int x, int y)
{
vis[x][y] = true;//标记该点已经走过
if (mp[x][y] == '.')//遍历结束的终点之一
{
cnt++;
return;
}
if (mp[x][y] == 'x')//遍历结束的终点之二
{
return;
}
for (int i = 0; i < 4; i++)//否则说明不只有一个‘o’
{
int tx = x + next_x[i];
int ty = y + next_y[i];
if (tx > 0 && tx < 10 && ty > 0 && ty < 10 && !vis[tx][ty])
{
vis[tx][ty] = true;
bfs(tx, ty);
}
}
}