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行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1  5 7
3 1  6 7
样例输出
12
11

思路:一道很普通的广搜,确实是太长时间没做了生疏了。需要注意的一点就是要考虑起点和终点相同的这种情况。

ac代码:

#include//二维数组的初始化需要放在定义的时候 
#include//如果终点和起点一样步数应该为0. 
#include
#define INF 0x3f3f3f
using namespace std;
struct node{
	int x,y,t;
}a,temp;
int x1,y1,x2,y2,cx[4]={0,0,1,-1},cy[4]={-1,1,0,0},vis[10][10];
int map[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,};
int jud(int x,int y){
	if(x<0&&x>8&&y<0&&y>8)
		return 0;
	if(map[x][y]==1||vis[x][y]==1)
		return 0;
return 1; 
}
void bfs(){
	memset(vis,0,sizeof(vis)); 
	queueq;
	int ans=INF;
	a.x=x1;
	a.y=y1;
	a.t=0;
	vis[a.x][a.y]=1;
	q.push(a);
	while(!q.empty()){
		a=q.front();
		q.pop(); 
		for(int i=0;i<4;i++){
			temp.x=a.x+cx[i];
			temp.y=a.y+cy[i];
			temp.t=a.t+1;
			if(jud(temp.x,temp.y)){
				vis[temp.x][temp.y]=1;
				if(temp.x==x2&&temp.y==y2)
					if(ans>temp.t)
						ans=temp.t;
				q.push(temp);
			}
		}
	}
	printf("%d\n",ans);
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		if(x1==x2&&y1==y2)
			printf("0\n"); 
		else
			bfs();
	}
	
	return 0;
} 

你可能感兴趣的:(BFS和DFS(搜索类问题))