[BFS]电子老鼠闯迷宫

电子老鼠闯迷宫

Description

如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。

在这里插入图片描述


Input


Output


Sample Input

12 //迷宫大小
2 9 11 8 //起点和终点
1 1 1 1 1 1 1 1 1 1 1 1 //邻接矩阵,0表示通,1表示不通
1 0 0 0 0 0 0 1 0 1 1 1
1 0 1 0 1 1 0 0 0 0 0 1
1 0 1 0 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 1
1 0 1 0 1 1 1 1 1 1 1 1
1 0 0 0 1 0 1 0 0 0 0 1
1 0 1 1 1 0 0 0 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1 0 1
1 1 1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1


Sample Output

(2,9)->(3,9)->(3,8)->(3,7)->(4,7)->(5,7)->(5,6)->(5,5)->(5,4)->(6,4)->(7,4)->(7,3)->(7,2)->(8,2)->(9,2)->(9,3)->(9,4)->(9,5)->(9,6)->(8,6)->(8,7)->(8,8)->(9,8)->(9,9)->(10,9)->(11,9)->(11,8)
27


代码

#include<stdio.h>
#include<iostream>
using namespace std;
const int dx[5]={0,0,-1,0,1};
const int dy[5]={0,-1,0,1,0}; //四个可延伸的点
int n,x1,y1,x2,y2,a[1005][1005],fa[1005],st[1005][2],ans,last;
int check(int x,int y){ //判断这个点能不能延伸
	if(x>0 and x<=n and y>0 and y<=n)
	 if(a[x][y]==0)return 1;
	return 0;
}
void print(int x){ //输出
	if(x==0)return ;
	ans++;
	print(fa[x]);	
	if(x!=last)
	 printf("(%d,%d)->",st[x][0],st[x][1]);
	  else printf("(%d,%d)\n",st[x][0],st[x][1]);  
	
}
void bfs(){
	int head=0,tail=1;
	st[1][0]=x1;st[1][1]=y1; 
	fa[1]=0;
	do{
		head++;
		for(int i=1;i<=4;i++){
			if(check(st[head][0]+dx[i],st[head][1]+dy[i])){
				tail++;				
				fa[tail]=head; //入队
				st[tail][0]=st[head][0]+dx[i];
				st[tail][1]=st[head][1]+dy[i]; 
				a[st[tail][0]][st[tail][1]]=1; //标记为走过的
			}
			if(st[head][0]==x2 and st[tail][1]==y2){ //判断有没有到达终点
				last=tail;
				print(tail);
				printf("%d",ans);
				return ;
			}
		}
	}while(head<=tail); 
}
int main(){
	scanf("%d",&n);
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	  scanf("%d",&a[i][j]);
	bfs(); 
	return 0;
}
posted @ 2019-12-06 19:47  unknown_future  阅读(49)  评论(0编辑  收藏  举报