问题描述
题目太长,直接转题目链接了
分析
该题参考网上题解,用广搜法。最开始用的是深搜,慢。。。这里查看广搜和深搜的差别。
注意字典序列: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;
}
总结
- 这次用的广搜,发现跟之前跳蚱蜢那题的套路一样。
- 广搜用队列,每个队列元素是一个结构体,在结构体里有涉及到题目的核心
- 将数据用string数组存储,然后变成一个二维的字符数组
- else if(i==2) 写成了else if(i=2)少写了个=。。。