数据结构实验三迷宫问题

#include <bits/stdc++.h>
using namespace std;
int m=0,n=0;//输入m行n列的矩阵
//初始化8个方向
int dir[8][2]= {{0,1},{0,-1},{1,0},{1,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int mp[505][505];//地图
int visit[505][505];//用来记录
struct node {
	int pre,next;//记录前一个点的坐标
	int num;
	int x,y;//自己的坐标
};
int ppath;
struct mmp {
	node * path = (struct node *)malloc(1000*sizeof(struct node));
	int front,tail;
};
void bfs() {
	mmp q;
	visit[1][1]=1;
	node tmp ;
	tmp.x=1;
	tmp.y=1;
	tmp.pre = -1;
	tmp.num=1;
	q.path[1]=tmp;
	q.front=1;
	q.tail=2;
	while(q.front<=q.tail) {
		node tp=q.path[q.front];
		q.front++;
		if(tp.x==m&&tp.y==n) {

			int nnm=tp.num;
			ppath = 1;
			node r=tp;
			while(tp.pre!=-1) {
				r=tp;
				tp=q.path[tp.pre];
				tp.next=r.num;

			}

			while(tp.next!=0) {
				printf("(%d,%d) ",tp.x,tp.y);
				tp=q.path[tp.next];
			}
			printf("(%d,%d) ",tp.x,tp.y);
			printf("(%d,%d)\n",m,n);
			break;
		}

		for(int i=0; i<8; i++) {
			int tx = tp.x+dir[i][0];
			int ty = tp.y+dir[i][1];

			if((!mp[tx][ty])&&(!visit[tx][ty])&&tx>=1&&tx<=m&&ty>=1&&ty<=n) {
				visit[tx][ty]=1;
				node tq;
				tq.x = tx;
				tq.y = ty;
				tq.pre = tp.num;
				tq.num=q.front;

				q.path[q.tail]=tq;
				q.tail++;
			}
		}
	}

}

int main() {
	while(scanf("%d %d",&m,&n)!=EOF) {
		//初始化
		//1为墙 0为可行路径
		memset(mp,0,sizeof(mp));
		memset(visit,0,sizeof(visit));

		for(int i=0; i<=n+1; i++)mp[0][i]=1;
		for(int i=0; i<=n+1; i++)mp[m+1][i]=1;

		for(int i=0; i<=m+1; i++)mp[i][0]=1;
		for(int i=0; i<=m+1; i++)mp[i][n+1]=1;

		srand(time(NULL));

		ppath = 0;//初始化no path

		for(int i=1; i<=m; i++)
			for(int j=1; j<=n; j++)
				mp[i][j]=rand()%2;

		mp[1][1]=0;
		mp[m][n]=0;

		for(int i=0; i<=m+1; i++)
			for(int j=0; j<=n+1; j++) {
				if(mp[i][j])
					printf("%%");
				else printf(" ");
				if(j==n+1)printf("\n");
			}
		bfs();
		if(!ppath)printf("No path!\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wym_king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值