5X5迷宫,求起点和终点的最短路径以及最短路径个数(百分数)

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
typedef struct node{
	int x;
	int y;
	int step;
}node;
//int maze[SIZE][SIZE] ={{1,1,0,0,1},{1,0,0,1,0},{0,1,0,1,0},{1,1,1,1,0},{1,1,1,1,1}};
int maze[SIZE][SIZE] = {};//迷宫
int num[SIZE][SIZE] = {{1,0,0,0,0},{},{},{},{}};//每个宫格被传染的次数,初始起点传染次数为1
node queue[30];//队列
int head,tail;//队头 队尾
int x[4] = {-1,0,1,0};//迷宫上/右/下/左四个方向
int y[4] = {0,1,0,-1};

void enqueue(node E){//用tail(对队尾)进行插入操作
	queue[tail++] = E;//先入队,tail加1
}
node dequeue(){//用head(队头)进行删除操作
	return queue[head++];	//先出队,然后head加一,返回出队元素
}

void print(){
	for(int i=0;i<SIZE;i++){
		for(int j=0;j<SIZE;j++){
			printf("%d ",maze[i][j]);
		}
		printf("\n");
	}
}
void print1(){
	for(int i=0;i<SIZE;i++){
		for(int j=0;j<SIZE;j++){
			printf("%d ",num[i][j]);
		}
		printf("\n");
	}
}
int main(){
	print();
	printf("**************");
	printf("\n");
	node SourcePoint = {0,0,1};//初始化原点
	enqueue(SourcePoint);//源点入队列
	maze[0][0] = 1;//把传染源置为1
	node CurPiont = {};//当前点
	node NewPiont = {0,0,10000};//新点,step设置比较大的值(不可能达到的值)
	while(head<tail){//队列运算结束条件
		//printf("%d %d\n", head, tail);
		CurPiont = dequeue();//当前点出队列
		for(int i=0;i<4;i++){//四个方向移动
			NewPiont.x = CurPiont.x + x[i];
			NewPiont.y = CurPiont.y + y[i];
		//碰到 NewPiont.step (已经被感染过的)
		if((NewPiont.x>=0)&&(NewPiont.x<SIZE)&&(NewPiont.y>=0)&&(NewPiont.y<SIZE)&&(maze[NewPiont.x][NewPiont.y] == NewPiont.step )){
				num[NewPiont.x][NewPiont.y] = num[NewPiont.x][NewPiont.y] + num[CurPiont.x][CurPiont.y];//将当前点的感染次数加上
			}
		//碰到 0 就感染,并将当前点的感染次数赋给新点的感染次数
		if((NewPiont.x>=0)&&(NewPiont.x<SIZE)&&(NewPiont.y>=0)&&(NewPiont.y<SIZE)&&(maze[NewPiont.x][NewPiont.y] == 0)){
			num[NewPiont.x][NewPiont.y] = num[CurPiont.x][CurPiont.y];//将当前点的感染次数赋给新点的感染次数
			NewPiont.step = CurPiont.step+1;//step加1
			maze[NewPiont.x][NewPiont.y] = NewPiont.step;//更新迷宫
			enqueue(NewPiont);//新点入队
			}
		}
	}
	printf("**************");
	printf("\n");
	print1();//输出感染次数矩阵
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值