DFS——找朋友

发布时间:2016-12-11 22:00:14 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"DFS——找朋友",主要涉及到DFS——找朋友方面的内容,对于DFS——找朋友感兴趣的同学可以参考一下。

找朋友 Time Limit: 1000MS Memory limit: 65536K 题目描述 X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。 为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。 输入 多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。 输出 若X可以到达Y的家,输出最少时间,否则输出 -1。 示例输入 3 3 X#Y *** #*# 3 3 X#Y *#* #*# 示例输出 4 -1 提示 这道题目可以用DFS做,Map 数组做地图,mv表示状态,主人每到一个地方,都有四个方向,用for循环依次遍历这四个方向,能够走就继续调用DFS函数,不能走则状态改为没有走。ans是找到Y时所用时间,sum纪录最短时间。 #include <stdio.h> #include <string.h> char Map[16][16]; int mv[16][16]; struct N { int x,y,ans; } q[300]; int jx[] = { 0,-1, 0, 1}; int jy[] = { 1, 0,-1, 0}; int Min; void dfs(int x,int y,int n,int m,int ans) { if(ans >= Min) { return ; } if(Map[x][y] == 'Y') { if(ans < Min) { Min = ans; } return ; } N f; for(int i = 0; i < 4; ++i) { f.x = x + jx[i]; f.y = y + jy[i]; if(0 <= f.x && f.x < n && 0 <= f.y && f.y < m && mv[f.x][f.y] == 0 && Map[f.x][f.y] != '#') { mv[f.x][f.y] = 1; dfs(f.x,f.y,n,m,ans+1); mv[f.x][f.y] = 0; } } } int main() { int n,m,i,j; while(scanf("%d %d",&n,&m) != EOF) { memset(mv,0,sizeof(mv)); for(i = 0; i < n; ++i) { scanf("%*c%s",Map[i]); } for(i = 0; i < n; ++i) { for(j = 0; j < m; ++j) { if(Map[i][j] == 'X') break; } if(j != m) break; } Min = (1<<20); dfs(i,j,n,m,0); if(Min == (1<<20)) { printf("-1\n"); } else { printf("%d\n",Min); } } return 0; }

上一篇:元胞自动机的Java模型代码
下一篇:Effecive C++ 解析3

相关文章

关键词: DFS——找朋友

相关评论