您的位置:首页 > 其它

51Nod - 1416 深度优先搜索

2017-05-11 00:53 246 查看
这道题是让你判断给定的地图中相同元素能否形成一个环

《----------------------------------------------------------思路-----------------------------------------------------------》

既然是判断是否形成回路 深搜比较合适  方法一是酱紫的: 可以对每一个点都跑一发dfs   需要注意的地方是dfs的终止条件  碰到与当前元素相同并且之前走过的点(idx)则停止;

提供一个方法二的思路 也能过 可能在实现上没有一简单  是酱紫的   最小环的大小为四(可以理解为深搜的层数或者步数)所以可以用常规的vis数组标记是否做过当前点  然后每走四步都恢复第一部中的标记 如果有一天走到了出发的点  就是有环了   这种方法需要记录路径和初始点;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define lson l,m,rt << 1
#define rson m+1,r,rt << 1 | 1
using namespace std;

int n, m;
char mapp[55][55];
int idx[55][55];
int flag;
void dfs(int x,int y,char op,int fromx,int fromy) {
if(flag)return ;
int move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
for(int i = 0; i < 4; i ++) {
int xx = x + move[i][0];
int yy = y + move[i][1];
if(xx >= 0 && xx < n && yy >=0 && yy < m ) {
if(fromx == xx && fromy == yy)continue;
if(mapp[xx][yy] != op)continue;
if(mapp[xx][yy] == op && idx[xx][yy]) {
//	cout<<xx<<" " <<yy<<"haha"<<endl;
flag = 1;return ;
}
idx[xx][yy] = 1;
dfs(xx , yy, op, x, y);
idx[xx][yy] = 0;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)) {
for (int i = 0; i < n; i ++) {
scanf("%s",mapp[i]);
}
flag = 0;
for(int i = 0; i < n; i ++) {
for(int j = 0; j < m; j ++) {
memset(idx,0,sizeof(idx));
dfs(i,j,mapp[i][j],-1,-1);
if(flag)break;
//	cout<<"haha";
}
if(flag)break;
}
if(flag)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: