求助
  • 板块题目总版
  • 楼主CuteGirlGC
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/14 12:47
  • 上次更新2024/3/14 17:16:08
查看原帖
求助
681755
CuteGirlGC楼主2024/3/14 12:47

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;
}
2024/3/14 12:47
加载中...