zoukankan      html  css  js  c++  java
  • 深搜——最少步数

     

    最少步数

    时间限制: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
    

    CODE:

    #include<iostream>
    #include<algorithm>  
    #include<cstdio>  
    #include<queue>  
    #include<cstring>

    using namespace std;

    char g[10][10]={"111111111","100100101","100110001","101011011","100001001","110101001","110101001","110100001","111111111"};
    int dir[4][4]={{-1,0},{0,1},{1,0},{0,-1}};
    int cnt;
    int used[9][9];
    struct node 

       int x,y,count; 
    }temp,ans; 

    int main()
    {
      int t,a,b,c,d,i,j,dx,dy;
      scanf("%d",&t);
      while(t--)
      {
         memset(used,0,sizeof(used)); 

         scanf("%d%d%d%d",&a,&b,&c,&d);
         queue<node>q//广搜用到队列
         temp.x=a; 
         temp.y=b; 
         temp.count=0; 
         q.push(temp); 
         used[a][b]=1; 
        while(!q.empty())  //很重要,深搜循环条件  
         { 
            ans.x=q.front().x;   
             ans.y=q.front().y;   
            ans.count=q.front().count;   
            q.pop();  
             if(ans.x==c && ans.y==d)  //深搜终止条件,搜到目的点
               break; 
             for( i=0;i<4;i++) 
             { 
                 if(!used[ans.x+dir[i][0]][ans.y+dir[i][1]]&& (ans.x+dir[i][0])>=0
         && (ans.x+dir[i][0])<=8 && (ans.y+dir[i][1])>=0
         && (ans.y+dir[i][1])<=8&& g[ans.x+dir[i][0]][ans.y+dir[i][1]]=='0')  //找出它的所有邻接点
                { 
                     used[ans.x+dir[i][0]][ans.y+dir[i][1]]=1; 
                     temp.x=ans.x+dir[i][0]; 
                     temp.y=ans.y+dir[i][1]; 
                     temp.count=ans.count+1;  //搜到下一层count加1
                     q.push(temp); 
                 }     
             } 
         } 
         printf("%d\n",ans.count); 
       } 
        return 0; 

    }

  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/hpuwangjunling/p/2343093.html
Copyright © 2011-2022 走看看