• 最少步数(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)分别表示起点的行、列,终点的行、列。
    输出
    输出最少走几步。
    样例输入
    2
    3 1  5 7
    3 1  6 7
    样例输出
    12

    11

    //深搜,遍历上下所有点找出最短路径

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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  ",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 ",min);  
    42.           
    43.     }  
    44. }</span>  

     

  • 相关阅读:
    多端统一框架Taro基础教程
    golang中的race检测
    【Golang】高性能编程之超时退出协程
    电容充放电时间常数RC计算方法(转)
    meanshift算法详解(转)
    vim 统计字符串在当前文档中出现的次数
    置信区间的理解
    IC 后端仿真: process corner 和 PVT (转)
    STA概念:一文了解NLDM与CCS(转)
    Linux 中 fg、bg、jobs 等指令(转)
  • 原文地址:https://www.cnblogs.com/weiliuyby/p/5937059.html
Copyright © 2020-2023  润新知