1. 程式人生 > >nyoj 58 最少步數(BFS)

nyoj 58 最少步數(BFS)

最少步數

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

題目大意:求出兩座標之間最短的距離;
基礎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;
}