2019年第十届蓝桥杯C/C++程序设计本科B组省赛 迷宫 输出路径(BFS记录路径&&模板)+赛后心得

昨天比赛刚结束 题目还没找着

题意大致如下:

给你一个30*50的图,图只有0和1组成,其中0是路1是墙,左上角和右下角是'0',输出最短路径并且按最小字典序输出,即按D<L<R<U的顺序输出。

 

解题思路:

BFS遍历过程中记录路径,既然题目中要求了遍历的顺序就按题目中的来遍历。

记录路径不要忘记在扩展每一个点的时候把上一个点的信息先继承下来,因为这里使用的是数组来保存每一步对应的方向。

 


 

 

这次比赛真的是体验差到爆,导致我从比赛中间到今天都处在非常自闭的状态。

没错,我就是在那个众所周知的一场比赛蓝屏n次的机房里,做到这道题的时候心比较乱,然后把代码就先放那了,准备打完下一道回来再静下心来修一下,然后下一道的代码刚打完测试完数据敲下回车的一瞬间,电脑蓝屏了。

遂重启。

然后抓紧时间把那道题的代码重新打一遍,然后又蓝屏。

遂又重启。

然后抓紧时间把那道题的代码重新打一遍,被管理员告知所有人停下,重启电脑。

遂又重启。

然后抓紧时间把那道题的代码重新打一遍...点了获取IP地址准备提交,又被管理员告知所有点自动获取IP地址的现在马上重启。

遂又重启。

 

前两次内心还是感觉心态有点炸的,代码没了敲就完事了呗。主要是很大程度的影响了状态,后面全程心如死水,没有生气也没有难过,异常平静的把后面的题敲完了然后又把这两道补回来,在补这道题的时候把第二个for循环里该用其他变量的时候还是用了i,不知道为什么犯这种低级错误。

三届蓝桥杯全程都陪跑了,很感谢有这样的经历,磨砺人的意志。

我要专心去准备考研啦,不知道考研一路上会遇到什么样的更难的事情呢。

感谢你们。

2019.3.25

 


 

代码:

没有优化

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

int n,m;
char mp[50][50];
int book[50][50];
int nx[4][2]={1,0,0,-1,0,1,-1,0};//DLRU
//int nx[4][2]={0,1,1,0,0,-1,-1,0};

struct node
{
	int x,y,step,dir[200];
};

void bfs()
{
	queue<node> q;
	node now,next;
	now.x=0;
	now.y=0;
	now.step=0;
	now.dir[0]=-1;
	q.push(now);
	while(!q.empty())
	{
		for(int i=0;i<4;i++)
		{
			int tx=q.front().x+nx[i][0];
			int ty=q.front().y+nx[i][1];
			if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]=='0'&&book[tx][ty]==0)
			{
				book[tx][ty]=1;
				if(tx==n-1&&ty==m-1)
				{
					printf("%d\n",q.front().step+1);
					for(int j=1;j<=q.front().step+1;j++)
					{
						if(q.front().dir[j]==0) printf("D");
						else if(q.front().dir[j]==1) printf("L");
						else if(q.front().dir[j]==2) printf("R");
						else if(q.front().dir[j]==3) printf("U");
						//printf("%d ",q.front().dir[i]);
					}
					if(i==0) printf("D");//输出最后一步 
					else if(i==1) printf("L");
					else if(i==2) printf("R");
					else if(i==3) printf("U");
					printf("\n");
					return;
				}
				next=q.front();
				next.x=tx;
				next.y=ty;
				next.step=q.front().step+1;
				next.dir[q.front().step+1]=i;
				q.push(next);
				
				
			}
		}
		q.pop();
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%s",mp[i]);
	}
	
	memset(book,0,sizeof(book));
	bfs();
	return 0;
}

/*

5 5
01000
01010
00000
01110
00010


3 3
011
000
110

*/

 

 

改了改顺序 可以拿这个做模板:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

int n,m;
char mp[50][50];
int book[50][50];
int nx[4][2]={1,0,0,-1,0,1,-1,0};//DLRU

struct node
{
	int x,y,step,dir[200];
};

void bfs()
{
	queue<node> q;
	node now,next;
	now.x=0;
	now.y=0;
	now.step=0;
	now.dir[0]=-1;
//	while(!q.empty())
//		q.pop();
	q.push(now);
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		if(now.x==n-1&&now.y==m-1)
		{
			printf("%d\n",now.step);
			for(int i=1;i<=now.step;i++)
			{
				if(now.dir[i]==0) printf("D");
				else if(now.dir[i]==1) printf("L");
				else if(now.dir[i]==2) printf("R");
				else if(now.dir[i]==3) printf("U");
			}
			printf("\n");
			return;
		}
		for(int i=0;i<4;i++)
		{
			int tx=now.x+nx[i][0];
			int ty=now.y+nx[i][1];
			if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]=='0'&&book[tx][ty]==0)
			{
				book[tx][ty]=1;
				next=now;
				next.x=tx;
				next.y=ty;
				next.step=now.step+1;
				next.dir[now.step+1]=i;
				q.push(next);
			}
		}
	}
}

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=0;i<n;i++)
		{
			scanf("%s",mp[i]);
		}
		memset(book,0,sizeof(book));
		bfs();
	}
	return 0;
}



/*

5 5
01000
01010
00000
01110
00010


3 3
011
000
110

*/

PS:这道题题目是固定的图案,不用自己输入n和m。只记得最后最少步数好像是186,所以记录路径的数组开到200就够用了。其他图案不够再加。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值