时隔13天,终于又a了一道水题。
一共9个位置,枚举9的6次种情况。
状态用二进制压缩一下。
#include <set>
#include <map>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define SF(a) scanf("%d", &a)
#define PF(a) printf("%d\n", a)
#define SFF(a, b) scanf("%d%d", &a, &b)
#define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define LL long long
#define maxn 10
#define maxm 205
#define mod 1000000007
#define INF 10000
using namespace std;
//-------------------------CHC------------------------------//
struct State {
int r[5], c[4];
State() { CLEAR(r, 0), CLEAR(c, 0); }
};
char g[5][15];
State tag;
bool vis[3][3];
const int dx[] = { 0, 1, 2 };
const int dy[] = { 0, 1, 2 };
void init_target() {
FOR(i, 0, 5) tag.r[i] = 0;
FOR(i, 0, 4) tag.c[i] = 0;
}
void get_target() {
FOR(i, 0, 5) FOR(j, 0, 9) {
int c = j >> 1;
if (j & 1) {
if (g[i][j] == '_') tag.r[i] |= (1 << c);
}
else {
if (g[i][j] == '|') tag.c[i - 1] |= (1 << c);
}
}
}
bool have_found(State s) {
bool ok = true;
FOR(i, 0, 5) if (s.r[i] != tag.r[i]) ok = false;
FOR(i, 0, 4) if (s.c[i] != tag.c[i]) ok = false;
return ok;
}
State put(State s, int x, int y) {
if (s.r[x + 1] & (1 << y)) s.r[x + 1] -= (1 << y);
if (s.r[x + 1] & (1 << (y + 1))) s.r[x + 1] -= (1 << (y + 1));
if (s.c[x] & (1 << (y + 1))) s.c[x] -= (1 << (y + 1));
if (s.c[x + 1] & (1 << (y + 1))) s.c[x + 1] -= (1 << (y + 1));
s.r[x] |= 1 << y, s.r[x] |= 1 << (y + 1);
s.r[x + 2] |= 1 << y, s.r[x + 2] |= 1 << (y + 1);
s.c[x] |= 1 << y, s.c[x + 1] |= 1 << y;
s.c[x] |= 1 << (y + 2), s.c[x + 1] |= 1 << (y + 2);
return s;
}
void print_state(State s) {
char t[5][10];
FOR(i, 0, 5) FOR(j, 0, 9) t[i][j] = ' ';
FOR(i, 0, 5) FOR(j, 0, 4) {
if (s.r[i] & (1 << j)) t[i][j << 1 | 1] = '_';
else t[i][j << 1 | 1] = ' ';
}
FOR(i, 0, 4) FOR(j, 0, 5) {
if (s.c[i] & (1 << j)) t[i + 1][j << 1] = '|';
else t[i + 1][j << 1] = ' ';
}
FOR(i, 0, 5) {
FOR(j, 0, 9) putchar(t[i][j]);
puts("");
}
}
bool dfs(State s, int d) {
if (d > 6) return false;
if (have_found(s)) return true;
FOR(i, 0, 3) FOR(j, 0, 3) {
if (!vis[i][j]) {
vis[i][j] = true;
State newstate = put(s, i, j);
//if (d == 0) printf("%d %d\n", i, j), print_state(newstate);
if (dfs(newstate, d + 1)) return true;
vis[i][j] = false;
}
}
return false;
}
int main() {
int kase = 1;
//IN(); OUT();
while (fgets(g[0], 15, stdin) && g[0][0] != '0') {
FOR(i, 1, 5) fgets(g[i], 15, stdin);
init_target();
get_target();
//print_state(tag);
printf("Case %d: ", kase++);
State s;
CLEAR(vis, 0);
puts(dfs(s, 0) ? "Yes" : "No");
}
return 0;
}