Manyan游戏,要求在1s内卡过,并且不能吸氧
#include <cstring>
#include <ctime>
#include <iostream>
#include <vector>
#pragma opetimize(2)
using namespace std;
const int kMaxN = 10;
int map[kMaxN][kMaxN], n;
long long c;
struct Operate {
int x, y, g;
Operate() {}
Operate(int x, int y, int g): x(x), y(y), g(g) {}
}a[kMaxN];
inline void Print(int map[kMaxN][kMaxN]) {
cout << "=======================\n";
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 5; j++) {
cout << map[i][j] << ' ';
}
cout << '\n';
}
cout << "=======================\n";
}
inline void down(int map[kMaxN][kMaxN]) {
for (int j = 1; j <= 5; j++) {
for (int i = 6; i >= 1; i--) {
if (!map[i][j]) {
for (int k = i + 1; k <= 7; k++) {
swap(map[k - 1][j], map[k][j]);
}
}
}
}
}
inline bool remove(int map[kMaxN][kMaxN]) {
bool can[kMaxN][kMaxN] = {};
for (int i = 1; i <= 7; i++) {
for (int j = 1; j + 2 <= 5; j++) {
if (map[i][j] == map[i][j + 1] && map[i][j + 1] == map[i][j + 2] && map[i][j] != 0) {
can[i][j] = can[i][j + 1] = can[i][j + 2] = 1;
}
}
}
for (int i = 1; i + 2 <= 7; i++) {
for (int j = 1; j <= 5; j++) {
if (map[i][j] == map[i + 1][j] && map[i + 1][j] == map[i + 2][j] && map[i][j] != 0) {
can[i][j] = can[i + 1][j] = can[i + 2][j] = 1;
}
}
}
bool f = 0;
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 5; j++) {
f |= can[i][j];
if (can[i][j]) {
map[i][j] = 0;
}
}
}
return f;
}
inline void move(int map[kMaxN][kMaxN], int i, int j, int x) {
swap(map[i][j], map[i][j + x]);
down(map);
while (remove(map)) {
down(map);
}
}
inline bool check(int map[kMaxN][kMaxN]) {
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 5; j++) {
if (map[i][j]) {
return 0;
}
}
}
return 1;
}
inline void copy(int mp[kMaxN][kMaxN], int map[kMaxN][kMaxN]) {
for (int i = 1; i <= 7; i++) {
for (int j = 1; j <= 5; j++) {
mp[i][j] = map[i][j];
}
}
}
inline void Dfs(int map[kMaxN][kMaxN], int x, Operate op[kMaxN]) {
if (x > n && check(map)) {
for (int i = 1; i <= n; i++) {
cout << op[i].y - 1 << ' ' << op[i].x - 1 << ' ' << op[i].g << '\n';
}
exit(0);
}
if (x > n) {
return;
}
bool o[11] = {};
int mp[kMaxN][kMaxN];
for (int j = 1; j <= 5; j++) {
for (int i = 1; i <= 7; i++) {
if (map[i][j]) {
if (j != 5) {
if (map[i][j] == map[i][j + 1]) {
if (o[map[i][j]]) {
continue;
}
o[map[i][j]] = 1;
}
copy(mp, map);
move(mp, i, j, 1);
Operate l[kMaxN];
for (int i = 1; i < x; i++) {
l[i] = op[i];
}
l[x] = Operate(i, j, 1);
Dfs(mp, x + 1, l);
}
if (j != 1 && !map[i][j - 1]) {
Operate l[kMaxN];
for (int i = 1; i < x; i++) {
l[i] = op[i];
}
l[x] = Operate(i, j, -1);
copy(mp, map);
move(mp, i, j, -1);
Dfs(mp, x + 1, l);
}
}
}
}
}
int main() {
#ifdef WUYIXUAN_
freopen("Manyan.in", "r", stdin);
#endif
cin >> n;
for (int i = 1; i <= 5; i++) {
int x, c = 0;
for (cin >> x; x; cin >> x) {
map[++c][i] = x;
}
}
Dfs(map, 1, a);
cout << -1;
}