首页 > 代码库 > 最少步数(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,1

0表示道路,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
 
 技术分享技术分享
  1. <span style="font-family:System;color:#009900;">#include<stdio.h>  
  2. int a,b,c,d;  
  3. int stemp,min;//stemp记录步数,min记录步数最小值   
  4. int map[9][9]={  
  5.  1,1,1,1,1,1,1,1,1,  
  6.  1,0,0,1,0,0,1,0,1,  
  7.  1,0,0,1,1,0,0,0,1,  
  8.  1,0,1,0,1,1,0,1,1,  
  9.  1,0,0,0,0,1,0,0,1,  
  10.  1,1,0,1,0,1,0,0,1,  
  11.  1,1,0,1,0,1,0,0,1,  
  12.  1,1,0,1,0,0,0,0,1,  
  13.  1,1,1,1,1,1,1,1,1  
  14. };  
  15. bool vis[9][9];  
  16. void dfs(int a,int b){  
  17.     if(a==c&&b==d){//printf("***%d %d %d \n",a,b,stemp);  
  18.         min=stemp>min?min:stemp;  
  19.         return ;  
  20.     }  
  21.     if(!vis[a][b]){  
  22.             vis[a][b]=1;//走过记为1   
  23.             int st=stemp++;//st记录本次搜索之前步数   
  24.             if(b+1<=8&&!map[a][b+1]) dfs(a,b+1);//向右   
  25.             if(b-1>=0&&!map[a][b-1]) dfs(a,b-1);//向左   
  26.             if(a+1<=8&&!map[a+1][b]) dfs(a+1,b);//向下   
  27.             if(a-1>=0&&!map[a-1][b]) dfs(a-1,b);//向上   
  28.             vis[a][b]=0;   
  29.             stemp=st;//本路不通或已经走过还原之前步数,没有这一步stemp可能会有累加多余步数   
  30.     }  
  31.   
  32. }  
  33. int main(){  
  34.     int T;  
  35.     scanf("%d",&T);  
  36.     while(T--){  
  37.         scanf("%d %d  %d %d",&a,&b,&c,&d);  
  38.         //printf(" %d %d",c,d);  
  39.         stemp=0,min=99999999;  
  40.         dfs(a,b);  
  41.         printf("%d\n",min);  
  42.           
  43.     }  
  44. }</span>  
技术分享

 

最少步数(dfs)