深度优先搜索练习之神奇的矩环
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
小鑫的女朋友被魔王抢走了!
魔王留给小鑫一张n*m大的表,上面有各种各样的颜色,用A-Z这26个字母来表示。魔王留给他一个任务,如果小鑫可以在这张表中找出任意一个长度大于1的环,并且这个环的颜色是相同的,魔王就把小鑫的女朋友还给他。为了从魔王手中夺回他的女朋友,小鑫请你帮忙,你能帮帮他吗?
Input
多组输入。
每组的第一行有两个整数n,m。代表表的大小。
接下来是由A-Z的一些字母所构成的n行m列的表。
1<=n,m<=200
Output
如果可以救回他的女朋友,输出Yes,否则输出No
Sample Input
4 7
ABCBBAA
BCBCBCB
AABBCCA
ACCCBBB
10 3
AAC
ABB
BBA
AAC
CBC
CCA
CBB
CCA
CCB
BAA
Sample Output
No
Yes
Hint
Source
这道题可以用暴力枚举搜索出来,复杂度O(NxM)。(什么鬼?说好的dfs呢?)
图的边界要优化,不要越界。
暴力枚举
#include <bits/stdc++.h>
using namespace std;
void dfs(int x, int y);
int main(){
ios::sync_with_stdio(0);
int n, m, f;
char Map[210][210];
while(cin >> n >> m){
memset(Map, '\0', sizeof(Map));
f = 0;
for(int i = 1; i <= n; i++) cin >> Map[i];
for(int i = 1; i < n; i++){
for(int j = 0; j < m - 1; j++){
if(Map[i][j] == Map[i][j + 1]){
if(Map[i][j] == Map[i + 1][j]){
if(Map[i][j] == Map[i + 1][j + 1]){
f = 1;
break;
}
}
}
}
if(f) break;
}
if(f) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
但是枚举的话这个样例输出No
3 4
AAAA
ACCA
AAAA
wtf??? 但是a了
dfs
#include <bits/stdc++.h>
using namespace std;
char Map[210][210];
bool a[210][210];
int v[4][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};
int n, m, f;
void dfs(int x, int y, int xx, int yy);
int main(){
ios::sync_with_stdio(0);
while(cin >> n >> m){
memset(a, 0, sizeof(a));
f = 0;
for(int i = 0; i < n; i++) cin >> Map[i];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(!a[i][j]){
dfs(i, j, i, j);
if(f) break;
}
}
if(f) break;
}
if(f) cout << "Yes" <<endl;
else cout << "No" << endl;
}
return 0;
}
void dfs(int x, int y, int xx, int yy){
a[x][y] = 1;
int c, d;
for(int i = 0; i < 4; i++){
c = x + v[i][0];
d = y + v[i][1];
if(c >= 0 && c < n && d >= 0 && d < m && Map[c][d] == Map[x][y]){
if(!a[c][d]) dfs(c, d, x, y);
else if(c != xx && d != yy){
f = 1;
return;
}
}
}
}