题目链接:codeforces
题目大意:
给一个矩阵,里面有不同字母,找到可以连成一圈的,最少4个以上,找到输出yes 否注no
思路:
看到题目,第一感觉就觉得是应该要用到搜素,使用dfs 对每个点搜素,从该点开始,寻找下一个符合要求的点。(下一个点要和自身相同,并且在矩阵内)每个点都上下左右走,但是不能往回走,一直走下去,直到又经过相同的位置,说明找到可以连成一圈的了。(对每个符合要求的点,走过vis就标记成1,如果遇到符合要求的下一个点,并且这个点的vis已经是1了 ,就说明走过了,绕了一圈回来了)
总结一下最近做的dfs: 好像就一次按照思路写完就直接ac了,其余都debug好久,dfs的题目感觉debug说简单也简单,按照思路不会错,但是有时候却死都找不到,这题debug了半个多小时。下次写dfs类型的题目,思路一定要清晰,写的时候要细心,递归判断条件要注意写对。这次就是因为递归判断是否找到,没注意写成vis[x][y],一直查不出,正确是判断下一步vis[next_x][next_y]。不该使用单步慢慢调试,使用输出调试更快,代码能力有很大的进步空间!
AC代码:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int vis[110][110], tx[4] = { 0,0,-1,1 }, ty[4] = {-1,1,0,0},flag=0,m,n;
char map[110][110];
int judge(int x, int y)
{
if (x < 0 || x >= n || y < 0 || y >= m)
return 0;
else return 1;
}
void dfs(int x, int y, int fx, int fy)
{
if (!judge(x, y))return;
vis[x][y] = 1;
int i;
for (i = 0; i < 4; ++i)
{
int next_x = x + tx[i];
int next_y = y + ty[i];
if (judge(next_x, next_y) && map[x][y] == map[next_x][next_y] && (next_x != fx||next_y != fy))
{
if (vis[next_x][next_y])
{
flag = 1;
return;
}
dfs(next_x, next_y, x, y);
}
}
return;
}
int main()
{
int i,j;
memset(vis, 0, sizeof(vis));
cin >> n >> m;
for (i = 0; i < n; ++i)
cin >> map[i];
for(i=0;i<n;++i)
for (j = 0; j < m; ++j)
{
if (!vis[i][j])
{
dfs(i, j, -1, -1);
}
}
if (flag)cout << "Yes";
else cout << "No";
return 0;
}