NYoj最少步数(DFS)

来源:互联网 发布:淘宝店铺注销流程 编辑:程序博客网 时间:2024/04/29 17:54
描述
这有一个迷宫,有0~8行和0~8列:

1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1 5 7
3 1 6 7
样例输出
12

11

思路:DFS,对表进行深搜,给你初始位置还有结束位置,直接查找就行,注意这道题最好不要用vis保存路径,直接对map改改成墙就行,每一个DFS后要还原路径map=0.

代码:

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#define MAXN 10000using namespace std;int map[9][9]={{1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,1,0,1},{1,0,0,1,1,0,0,0,1},{1,0,1,0,1,1,0,1,1},{1,0,0,0,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1}};int mi;int x1,y1,x2,y2;void dfs(int x1,int y1,int ans){if(map[x1][y1])return ;ans++;if(x1==x2&&y1==y2){if(ans<mi)mi=ans;return ;}map[x1][y1]=1;dfs(x1,y1+1,ans);dfs(x1,y1-1,ans);dfs(x1+1,y1,ans);dfs(x1-1,y1,ans);map[x1][y1]=0;}int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d %d %d",&x1,&y1,&x2,&y2);int ans=0;mi=MAXN;dfs(x1,y1,ans);printf("%d\n",mi-1);}}


0 0
原创粉丝点击