专题训练二 搜索进阶 HDU - 2102 A计划

HDU - 2102 A计划

#include<bits/stdc++.h>
using namespace std;
char mp[2][11][11];
bool vis[2][11][11];
int dir[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, m, T;
struct node {
	int z, x, y, step;
	node(){};
	node(int z, int x, int y, int step) : z(z), x(x), y(y), step(step) {};
}st, en;
bool check(int z, int x, int y) {
	return z >= 0 && z < 2 && x >= 0 && x < n && y >= 0 && y < m 
			&& mp[z][x][y] != '*';
}
void bfs() {
	memset(vis, false, sizeof(vis));
	queue<node> q;
	q.push(node(0, 0, 0, 0));
	vis[0][0][0] = true;
	while(!q.empty()) {
		node cur = q.front(); q.pop();
		int z = cur.z, x = cur.x, y = cur.y, step = cur.step;
		if(z == en.z && x == en.x && y == en.y) {
			cout << "YES" << endl;
			return ;
		}
		for(int i = 0; i < 4; i++) {
			int nx = x + dir[i][0], ny = y + dir[i][1], nz = z;
			if(check(nz, nx, ny) && !vis[nz][nx][ny] && step+1 <= T) {
				vis[nz][nx][ny] = true;
				if(mp[nz][nx][ny] == '#') {
					if(vis[!nz][nx][ny] || mp[!nz][nx][ny] == '*' || mp[!nz][nx][ny] == '#') {
						continue;
					}
					vis[!nz][nx][ny] = true;
					nz = !z;
				}
				q.push(node(nz, nx, ny, step+1));
			}
		}
	}
	cout << "NO" << endl;
	return ; 
}
int main() {
	int t; cin >> t;
	while(t--) {
		cin >> n >> m >> T;
		for(int c = 0; c < 2; c++) {
			for(int i = 0; i < n; i++) {
				for(int j = 0; j < m; j++) {
					cin >> mp[c][i][j];
					if(mp[c][i][j] == 'S') st = node(c, i, j, 0);
					else if(mp[c][i][j] == 'P') en = node(c, i, j, 0);
				}
			}
		}
		bfs();
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值