NYOJ 58 最少步數(廣搜入門經典)
阿新 • • 發佈:2019-02-02
最少步數
時間限制: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,10表示道路,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; }