nyoj 58 最少步數(BFS)
阿新 • • 發佈:2019-02-01
最少步數
時間限制: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
-
題目大意:求出兩座標之間最短的距離;
基礎BFS
2015,3,18 -
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; struct node{ int x,y; }; int graph[][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}, }; int vis[9][9]; int dir[4][2]={ {-1,0},{1,0},{0,-1},{0,1}}; int main(){ int i,j,t,a,b,c,d; scanf("%d",&t); while(t--){ memset(vis,0,sizeof(vis)); scanf("%d%d%d%d",&a,&b,&c,&d); queue<node>Q; node num; num.x=a;num.y=b; Q.push(num); vis[a][b]=1; while(!Q.empty()){ num=Q.front(); Q.pop(); for(i=0;i<4;i++){ int m=num.x+dir[i][0]; int n=num.y+dir[i][1]; if(n<=0||m<=0||m>=8||n>=8||vis[m][n]!=0||graph[m][n]==1) continue; if(!vis[m][n]){ vis[m][n]=vis[num.x][num.y]+1; node v; v.x=m; v.y=n; Q.push(v); } } } printf("%d\n",vis[c][d]-1); } return 0; }