首页 > 代码库 > 最少步数(dfs)
最少步数(dfs)
最少步数
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
这有一个迷宫,有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,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。 - 输出
- 输出最少走几步。
- 样例输入
23 1 5 73 1 6 7
- 样例输出
12
11
//深搜,遍历上下所有点找出最短路径
- [cpp] view plain copy
- <span style="font-family:System;color:#009900;">#include<stdio.h>
- int a,b,c,d;
- int stemp,min;//stemp记录步数,min记录步数最小值
- 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
- };
- bool vis[9][9];
- void dfs(int a,int b){
- if(a==c&&b==d){//printf("***%d %d %d \n",a,b,stemp);
- min=stemp>min?min:stemp;
- return ;
- }
- if(!vis[a][b]){
- vis[a][b]=1;//走过记为1
- int st=stemp++;//st记录本次搜索之前步数
- if(b+1<=8&&!map[a][b+1]) dfs(a,b+1);//向右
- if(b-1>=0&&!map[a][b-1]) dfs(a,b-1);//向左
- if(a+1<=8&&!map[a+1][b]) dfs(a+1,b);//向下
- if(a-1>=0&&!map[a-1][b]) dfs(a-1,b);//向上
- vis[a][b]=0;
- stemp=st;//本路不通或已经走过还原之前步数,没有这一步stemp可能会有累加多余步数
- }
- }
- int main(){
- int T;
- scanf("%d",&T);
- while(T--){
- scanf("%d %d %d %d",&a,&b,&c,&d);
- //printf(" %d %d",c,d);
- stemp=0,min=99999999;
- dfs(a,b);
- printf("%d\n",min);
- }
- }</span>
最少步数(dfs)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。