【42】蓝桥杯之迷宫(填空题)

问题描述

题目太长,直接转题目链接

分析

该题参考网上题解,用广搜法。最开始用的是深搜,慢。。。这里查看广搜和深搜的差别。
注意字典序列:D<L<R<U

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 30;
const int M = 50;
string ss[N]={"01010101001011001001010110010110100100001000101010",
"00001000100000101010010000100000001001100110100101",
"01111011010010001000001101001011100011000000010000",
"01000000001010100011010000101000001010101011001011",
"00011111000000101000010010100010100000101100000000",
"11001000110101000010101100011010011010101011110111",
"00011011010101001001001010000001000101001110000000",
"10100000101000100110101010111110011000010000111010",
"00111000001010100001100010000001000101001100001001",
"11000110100001110010001001010101010101010001101000",
"00010000100100000101001010101110100010101010000101",
"11100100101001001000010000010101010100100100010100",
"00000010000000101011001111010001100000101010100011",
"10101010011100001000011000010110011110110100001000",
"10101010100001101010100101000010100000111011101001",
"10000000101100010000101100101101001011100000000100",
"10101001000000010100100001000100000100011110101001",
"00101001010101101001010100011010101101110000110101",
"11001010000100001100000010100101000001000111000010",
"00001000110000110101101000000100101001001000011101", 
"10100101000101000000001110110010110101101010100001",
"00101000010000110101010000100010001001000100010101",
"10100001000110010001000010101001010101011111010010",
"00000100101000000110010100101001000001000000000010",
"11010000001001110111001001000011101001011011101000",
"00000110100010001000100000001000011101000000110011",
"10101000101000100010001111100010101001010000001000",
"10000010100101001010110000000100101010001011101000",
"00111100001000010000000110111000000001000000001011",
"10000001100111010111010001000110111010101101111000"};

bool vis[N][M];
// D L R U 字典序
int dir[4][2]={1,0,0,-1,0,1,-1,0};
struct node{
	int x;
	int y;
	int step;
	string str;
	node(int _x,int _y,int _step,string _str){
		x = _x;
		y = _y;
		step = _step;
		str = _str;
	} 
};
queue<node> q;
int main(){
	node n(0,0,0,"");
	q.push(n);
	vis[0][0] = true;
	string s="";
	while(!q.empty()){
//		队首的为新节点 
		node now = q.front();
//		弹出队首元素 
		q.pop();
		if(now.x==N-1&&now.y==M-1){
			cout<<now.step<<endl;
			cout<<now.str<<endl;
		}
//		将与队首相关的元素放入栈内 
		for(int i =0 ;i<4;i++){
			int tx = now.x+dir[i][0];
			int ty = now.y+dir[i][1];
//			vis[tx][ty] 为true 该点访问过 
			if(tx<0||ty<0||tx>=N||ty>=M||vis[tx][ty]||ss[tx][ty]=='1'){
				continue;
			}
			if(i==0)
				s = "D";
			else if(i==1)
				s = "L";
			else if(i==2)
				s = "R";
			else
				s = "U";
			vis[tx][ty] = true; 
			q.push(node(tx,ty,now.step+1,now.str+s));
		}
	}
	return 0;
} 

总结

  1. 这次用的广搜,发现跟之前跳蚱蜢那题的套路一样。
  2. 广搜用队列,每个队列元素是一个结构体,在结构体里有涉及到题目的核心
  3. 将数据用string数组存储,然后变成一个二维的字符数组
  4. else if(i==2) 写成了else if(i=2)少写了个=。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值