最少步数(dfs)
Posted 如许之秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最少步数(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)分别表示起点的行、列,终点的行、列。 - 输出
- 输出最少走几步。
- 样例输入
-
2 3 1 5 7 3 1 6 7
- 样例输出
-
12
11
-
//深搜,遍历上下所有点找出最短路径
-
- <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)的主要内容,如果未能解决你的问题,请参考以下文章