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; 

    }

  • 相关阅读:
    Windows系统开机硬盘自检问题解决
    更改软件默认安装路径
    windows添加开机启动项
    xp 如何打开(进行)远程桌面连接
    xp看系统位数
    教你创建一个别人打不开删不掉的文件夹(干坏事爱好者必看)
    无操作一段时间显示器无信号
    长时间用电脑,(给窗口选一个合适的颜色)设置窗口绿色
    Windows右键菜单设置与应用技巧
    Outlook如何定时发邮件
  • 原文地址:https://www.cnblogs.com/hpuwangjunling/p/2343093.html
Copyright © 2011-2022 走看看