NYOJ 題目58 最少步數(BFS)
阿新 • • 發佈:2019-01-25
最少步數
時間限制: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
#include<stdio.h> #include<string.h> #include<queue> #include <algorithm> using namespace std; struct Seat {//位置 int x; int y; }; int main() { 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}, }, judge[9][9], dir[4][2]={ {0,-1},{0,1},{-1,0},{1,0},//上下左右 }; int N,x,y,a,b,c,d,i,j; scanf("%d",&N); while(N--) { scanf("%d %d %d %d",&a,&b,&c,&d); memset(judge,0,sizeof(judge)); queue<Seat>Q; struct Seat num; num.x=a;num.y=b; Q.push(num); judge[a][b]=1; while(!Q.empty()) { num=Q.front(); Q.pop(); for(i=0;i<4;i++) { x=num.x+dir[i][0]; y=num.y+dir[i][1]; if(x<=0||x>=8||y<=0||y>=8||graph[x][y]==1||judge[x][y]!=0) continue; if(judge[x][y]==0) { judge[x][y]=judge[num.x][num.y]+1; struct Seat p; p.x=x;p.y=y; Q.push(p); } } } // for(i=0;i<9;i++) // { // for(j=0;j<9;j++) // printf("%d ",judge[i][j]); // // printf("\n"); // } printf("%d\n",judge[c][d]-1); } return 0; }