本文主要是介绍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;
}
这篇关于DFS——找朋友的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!