深度优先算法(dfs)
对每个可能的分支路径进行深入,直至不能再深入,其中每个节点只能访问一次;
题目描述
国服元歌的傀儡丢了,要知道元歌没了傀儡就什么也不是了,他很想知道他还能不能找到他的傀儡,好心的你可以帮帮他嘛~
测试数据多组, 矩阵n ( 1 < n < 20 ) ‘.’表示可以通行,‘*’不可以通行。
输入
输入 n,和元歌所在位置(a, b), 傀儡所在位置(c,d)
输出
如果元歌可以找到傀儡就输出Yes 否则输出No
样例输入 复制
3
...
...
...
0 0 2 2
样例输出 复制
Yes
提示
国服元歌提醒你,有多组输入哦
注意:
- 每次执行完一组数据后,要将flag赋值为0;
- 将所到的位置赋值为‘*’,防止再次寻找,search后再恢复,以供下次寻找;
代码如下:
#include<stdio.h>
char map[21][21];//矩阵
int yuange[2], kuilei[2];//元歌,傀儡的坐标
int flag = 0;//标记
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };//四个方向
int n;
int search(char map[][21], int x, int y)
{
//发现傀儡,flag=1;
if (x == kuilei[0] && y == kuilei[1])
{
flag = 1;
return 0;
}
//若没找到,下一步的寻找过程
int i, sx, sy;
for (i = 0; i < 4; i++)//分别向四个方向寻找
{
sx = x + dir[i][0];
sy = y + dir[i][1];
if (sx >= 0 && sx < n && sy >= 0 && sy < n)
if (map[sx][sy] == '.')
{
map[sx][sy] = '*';
search(map, sx, sy);//递归
map[sx][sy] = '.';
}
}
}
int main()
{
while (~scanf("%d\n", &n))
{
flag = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%c", &map[i][j]);
}
getchar();
}
scanf("%d %d", &yuange[0], &yuange[1]);
if (map[yuange[0], yuange[1]] == "*")
{
printf("No\n");
return 0;
}
scanf("%d %d", &kuilei[0], &kuilei[1]);
search(map, yuange[0], yuange[1]);
if (flag == 1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
新手上路;翻车请多多谅解;
创作不易,点个赞呗