一个简单的按照给出路径验证迷宫的问题,之所以记录下来是因为我觉得这也是一种题型,可以按照迷宫的那个模板进行更改。
Problem Description
大家都知道孔子吧,春秋战国时候的一个老头儿。当时出国还不用护照,所以他经常赶着牛车带着弟子们周游列国。可是这路也并不是那么好走的,当遇到高山时孔子他们就得绕着走了,你得考虑他牛车的实力能不能hold住啊。当然,孔子是个很聪明的人,每次出门前都会四处打听,然后制定出一个赶车路线,然后按照路线去走。但是,由于很多路没有亲自走过他也不确定按这个路线到底能不能周游列国?然而,你有当时的地图,希望你编程判断一下按照孔子的行车路线能不能周游列国。
Input
第一行是行车路线即一个字符串只包含L,R,U和D分别代表左走,右走,上走,下走。接下来以上是两个整数H和W,0 < H,W < 20, 代表地图的高和宽。然后是H*W的地图。S代表孔子的起点。标有1~7的区域分别代表7个国家的领土,#代表高山。
Output
如果孔子能周游列国即经过这7个国家则输出Yes,否则输出No。
Example Input
RDDDDLRRRRUU
5 5
S1111
22#22
33#44
56#77
56777
Example Output
Yes
#include<iostream>
#include<string>
#include<set>
using namespace std;
struct node {
char p;
int q;
};
char map[1024][1024];
node go[1024];
int mo[4][2] = { {0,1}, {1,0}, {0,-1} ,{-1,0} };
int m,n,sx,sy,x2,y2,num,flag=0;
set<int>se;
void dfs(int x, int y, int i) {
if (i==num) {
int sum1 = 0;
int sum2 = 1;
for (auto iter : se) {
//cout << iter << " ";
if (iter != 0) {
sum1 += iter;
sum2 *= iter;
}
}
//cout << endl;
if (sum1 == 28&&sum2==5040)
flag = 1;
return;
}
if (i < num) {
int s = go[i].q;
if (x + mo[s][0] < m&&x + mo[s][0] >= 0 && y + mo[s][1] < n&&y + mo[s][1] >= 0
&& map[x + mo[s][0]][y + mo[s][1]] != '#') {
se.insert(map[x + mo[s][0]][y + mo[s][1]]-'0');
if (flag)return;
else dfs(x + mo[s][0], y + mo[s][1], i + 1);
}
else dfs(x, y, i + 1);
}
}
int main(void) {
string str;
cin >> str;
num = str.length();
for (int i = 0; i < str.length(); i++) {
go[i].p = str[i];
char ch = str[i];
if (ch == 'R')go[i].q = 0;
if (ch == 'D')go[i].q = 1;
if (ch == 'L')go[i].q = 2;
if (ch == 'U')go[i].q = 3;
}
cin >> m >> n;
for(int i=0;i<m;i++)
for (int j = 0; j < n; j++) {
char m; cin >> m;
map[i][j] = m;
if (m == 'S')sx = i, sy = j, map[i][j] = '0';
}
dfs(sx, sy,0);
if (flag)cout << "Yes" << endl;
else cout << "No" << endl;
system("pause");
}