从今以后,我将会用一个假的标题!
当然,不是每天都是愚人节

传送门

???

思路

状压+爆搜。
状压——压机关的触发。
比如:11010 B 就表示第 2 、第 4 、第 5 个机关被触发了奇数次。
当我们踏上一个新格子时:

  • 检查这个格子被影响了多少遍,以及这个格子最初能不能走,以此来判断这是不是墙。
  • 检查这个状态有没有走过。
  • 切换状态。
    注意:
  • 要记录 $ r, c, dist, state $ 四个属性。
  • 不要把 $ dist $ 存到数组里,会爆空间啊!!!

代码

#include <bits/stdc++.h>
using namespace std;

int dr[] = {1, 0, -1, 0};
int dc[] = {0, 1, 0, -1};

int n, m, k;
bool vis[1 << 15][35][35];
bool maze[35][35];
int r[15], c[15], R[15], C[15];
int sr, sc, tr, tc;

queue<pair<pair<int, int>, pair<int, int> > > que;

void get_maze() {
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++) {
		getchar();
        getchar();
		for (int j = 0; j < m; j++) {
			char ch = getchar();
			if (ch == 'S') {
				sr = i, sc = j;
			} else if (ch == 'T') {
				tr = i, tc = j;
			} else if (ch == '#') {
				maze[i][j] = 1;
			}
		}
	}
}

void get_button() {
	scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		scanf("%d %d %d %d", &r[i], &c[i], &R[i], &C[i]);
		r[i]--;
		c[i]--;
		R[i]--;
		C[i]--;
	}
}

bool changed_time(int rr, int cc, int state) {
	bool ans = 0;
	for (int i = 0; i < k; i++) {
		if ((state >> i) & 1) {
			if (R[i] == rr && C[i] == cc) {
				ans = !ans;
			}
		}
	}
	return ans;
}

int change(int st, int rr, int cc) {
	for (int i = 0; i < k; i++) {
		if (r[i] == rr && c[i] == cc) {
			st ^= (1 << i);
		}
	}
	return st;
}

void bfs() {
	que.push(make_pair(make_pair(0, 0), make_pair(sr, sc)));
	vis[0][sr][sc] = 1;
	while (que.size()) {
		int st = que.front().first.first;
		int dis = que.front().first.second;
		int cr = que.front().second.first;
		int cc = que.front().second.second;
		if (cr == tr && cc == tc) {
			printf("%d", dis);
			break;
		}
		que.pop();
		for (int i = 0; i < 4; i++) {
			int nr = cr + dr[i];
			int nc = cc + dc[i];
			if (!(0 <= nr && nr < n && 0 <= nc && nc < m)) {
				continue;
			}
			if (!changed_time(nr, nc, st) ^ maze[nr][nc] && !vis[change(st, nr, nc)][nr][nc]) {
				vis[change(st, nr, nc)][nr][nc] = 1;
				que.push(make_pair(make_pair(change(st, nr, nc), dis + 1), make_pair(nr, nc)));
			}
		}
	}
}

int main() {
	get_maze();
	get_button();
	bfs();
	return 0;
}

感觉我现在就是水博客/kk

原文地址:http://www.cnblogs.com/AProblemSolver/p/16926505.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性