首页 > 代码库 > ZOJ 3814 Sawtooth Puzzle BFS
ZOJ 3814 Sawtooth Puzzle BFS
感觉可以用BFS撸,然后就撸了,样例无限不过,代码能力真是弱。。
#include <cstdio>#include <cstring>#include <algorithm>#include <set>#include <queue>using namespace std;const int bufsize = 128;char buf[bufsize][bufsize];struct Block { char str[10][10]; void Rotate() { for (int i = 0; i < 8; i++) { for (int j = i + 1; j < 8; j++) { swap(str[i][j], str[j][i]); } } for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { swap(str[i][j], str[i][8 - j - 1]); } } } bool operator == (const Block &x) const { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (str[i][j] != x.str[i][j]) { return false; } } } return true; }};void getBlock(Block block[9]) { for (int i = 0; i < 24; i++) { for (int j = 0; j < 24; j++) { scanf(" %c", &buf[i][j]); } } int id = 0; for (int i = 0; i < 24; i += 8) { for (int j = 0; j < 24; j += 8) { for (int dx = 0; dx < 8; dx++) { for (int dy = 0; dy < 8; dy++) { block[id].str[dx][dy] = buf[i + dx][j + dy]; } } id++; } }}bool finalst[1 << 18];Block ori[9], tar[9];int e[9];void make_hash(int pos, int val) { if (pos == -1) { finalst[val] = true; return; } for (int i = 0; i < 4; i++) { if (ori[pos] == tar[pos]) { make_hash(pos - 1, val << 2 | i); } ori[pos].Rotate(); }}void input() { getBlock(ori); getBlock(tar); memset(e, 0, sizeof(e)); for (int i = 0; i < 9; i++) { for (int j = 0; j < 4; j++) { int tmp; scanf("%d", &tmp); e[i] |= (tmp << j); } }}bool vis1[9];const int dx[4] = { 0, -1, 0, 1 };const int dy[4] = { -1, 0, 1, 0 };int gete(int state, int pos) { int mask = 3 << (pos << 1), val = (state & mask) >> (pos << 1); int ret = e[pos]; for (int i = 0; i < val; i++) { int bit = (ret & (1 << 3)) >> 3; ret &= (1 << 3) - 1; ret <<= 1; ret |= bit; } return ret;}void dfs(int &nstate, int state, int pos, int d) { vis1[pos] = true; int mask = 3 << (pos << 1), val = (state & mask) >> (pos << 1); if (d == 0) val = (val + 1) % 4; else val = (val + 3) % 4; nstate &= ~mask; nstate |= val << (pos << 1); int x = pos / 3, y = pos % 3; for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i], npos = nx * 3 + ny; if (nx < 0 || nx > 2 || ny < 0 || ny > 2) continue; if (vis1[npos]) continue; int e1 = gete(state, pos), e2 = gete(state, npos); if ((e1 & (1 << i)) && (e2 & (1 << ((i + 2) % 4)))) { dfs(nstate, state, npos, d ^ 1); } }}int Rotate(int state, int pos) { memset(vis1, 0, sizeof(vis1)); int ret = state; dfs(ret, state, pos, 0); return ret;}bool vis[1 << 18];void solve() { memset(finalst, 0, sizeof(finalst)); memset(vis, 0, sizeof(vis)); make_hash(8, 0); queue<int> q, qd; q.push(0); qd.push(0); vis[0] = true; while (!q.empty()) { int nowstate = q.front(); q.pop(); int nowdist = qd.front(); qd.pop();; if (finalst[nowstate]) { printf("%d\n", nowdist); return; } for (int i = 0; i < 9; i++) { int nstate = Rotate(nowstate, i); if (!vis[nstate]) { q.push(nstate); qd.push(nowdist + 1); vis[nstate] = true; } } } puts("-1");}int main() { int T; scanf("%d", &T); while (T--) { input(); solve(); } return 0;}
ZOJ 3814 Sawtooth Puzzle BFS
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。