1. 程式人生 > >NYOJ 58 最少步數(廣搜入門經典)

NYOJ 58 最少步數(廣搜入門經典)

最少步數

時間限制: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

    廣搜入門經典題,這個已經給出了迷宮就無需錄入了,簡單來說可以分為四步,

1:輸入起點終點,

2:規定搜尋的方向,

3:判斷是否到達終點,沒有到,繼續搜尋。

4:到達終點,輸出最短距離。

#include<stdio.h>
#include<string.h>
int a[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,
             };
struct node
{
    int x,y,s;
};
int main()
{
    struct node que [1000];
   int book[10][10];
   int next[4][2]={0,1,1,0,0,-1,-1,0};
   int i,j,startx,starty,n,m,tx,ty,p,q,flag;
   scanf("%d",&n);
   while(n--)
   {
       memset(book,0,sizeof(book));
       scanf("%d%d%d%d",&startx,&starty,&p,&q);
       if(startx==p&&starty==q)//這個特別坑,再原點不動直接輸出0.
       {
           printf("0\n");
           continue;
       }
       int head=1,tail=2;
       que[head].x=startx;
       que[head].y=starty;
       que[head].s=0;
       flag=0;
       while(tail>head)
       {
           for(i=0;i<4;i++)
           {
               tx=que[head].x+next[i][0];
               ty=que[head].y+next[i][1];
               if(tx<0||tx>8||ty<0||ty>8)
                continue;
               if(a[tx][ty]==0&&book[tx][ty]==0)
               {
                   book[tx][ty]=1;
                   que[tail].x=tx;
                   que[tail].y=ty;
                   que[tail].s=que[head].s+1;
                   tail++;
               }
               if(tx==p&&ty==q)
               {
                   flag=1;
                   break;
               }
           }
           if(flag==1)
            break;
           head++;
       }
       printf("%d\n",que[tail-1].s);
   }
   return 0;
}