站外题求助
  • 板块学术版
  • 楼主Vitamin_B
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/14 12:49
  • 上次更新2024/3/14 17:16:07
查看原帖
站外题求助
743373
Vitamin_B楼主2024/3/14 12:49

题目描述:

今天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

WA Code:

# 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
*/
2024/3/14 12:49
加载中...