今天Steven得去上课,不过碰巧路边的洒水器启动了,Steven不想被水淋到,所以他想能不能在不被水淋到,并且每个格子只经过1次的情况下到达教室。 现在给你地图的宽n,和高m,以及洒水器的个数q。 之后n行,每行m个字符,表示地图。 地图中的"."表示可以经过的点,数字"x"表示在这个位置有x号洒水器(不可经过) 之后q行,每行一个数字,分别对应1~q号洒水器的初始洒水方向。 "0"表示向上,"1"表示向左,"2"表示向下,"3"表示向右。
(洒水器的方向逆时针旋转,洒水的范围只有一格,Steven每走一格,洒水器的方向就旋转90°) (Steven位于(1,1),教室位于(n,m)) 注:如果Steven在洒水器本身这格也会被淋到 如果Steven能成功走到教室,输出YES,否则输出NO
第一行输入一个整数T,表示有T组数据(1<=T<=10) 第一行输入n,m,q (1<=n<=6, 1<=m<=8, 1<=q<=9) 接下来n行,每行m个字符表示地图 之后q行,每行一个数字x表示初始洒水方向(0<=x<=3)
成功到教室输出YES,否则输出NO
1
2 2 1
..
1.
0
NO
# include <bits/stdc++.h>
# define ffor(i,name) \
for (auto i = name.begin (); i != name.end (); ++ i)
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
struct node {
int x, y, step;
} ;
const int waterx[] = {-1, 0, 1, 0}, watery[] = {0, -1, 0, 1}, dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};
int t, n, m, Q, s[15], X, Y, x;
string a[10];
bitset <10> vis[10], mp[10][4];
queue <node> q;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> t;
while (t --) {
cin >> n >> m >> Q;
for (int i = 0; i < n; ++ i) {
cin >> a[i];
for (int j = 0; j < m; ++ j)
vis[i][j] = mp[i][j][0] = mp[i][j][1] = mp[i][j][2] = mp[i][j][3] = 0;
}
for (int i = 0; i < Q; ++ i)
cin >> s[i];
for (int i = 0; i < n; ++ i)
for (int j = 0; j < m; ++ j)
if (a[i][j] != '.')
for (int k = 0; k < 4; ++ k) {
x = (s[a[i][j] - '1'] + k) & 3;
X = i + waterx[x], Y = j + watery[x];
if (~ X && ~ Y && X < n && Y < m)
mp[X][Y][k] = 1;
mp[i][j][k] = 1;
}
// for (int i = 0; i < n; ++ i) for (int j = 0; j < m; ++ j) for (int k = 0; k < 4; ++ k) cerr << i << ',' << j << ',' << k << ':' << mp[i][j][k] << '\n';
if (mp[0][0][0]) {
cout << "NO\n";
continue ;
}
vis[0][0] = 1;
q.push ({0, 0, 0});
while (! q.empty ()) {
node x = q.front ();
if (x.x > n - 2 && x.y > n - 2) {
cout << "YES\n";
while (! q.empty ())
q.pop ();
goto there;
}
q.pop ();
++ x.step, x.step &= 3;
for (int i = 0; i < 4; ++ i) {
X = x.x + dx[i], Y = x.y + dy[i];
if (~ X && ~ Y && X < n && Y < m && ! mp[X][Y][x.step] && ! vis[X][Y])
vis[X][Y] = 1, q.push ({X, Y, x.step});
}
}
cout << "NO\n";
there:
;
}
return 0;
}
/*
2
3 3 1
...
.1.
...
0
3 3 1
...
.1.
...
1
*/