专栏文章
题解:P1312 [NOIP2011 提高组] Mayan 游戏
P1312题解参与者 3已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @miqhrf30
- 此快照首次捕获于
- 2025/12/04 05:00 3 个月前
- 此快照最后确认于
- 2025/12/04 05:00 3 个月前
思路
本题为 DFS。
创建三个函数,实现三个模块。
down: 实现方块的下落。del: 实现方块的消除。dfs: 实现主要生成函数。
对于左移部分,如果左边为空才需要左移,否则,这个方块会被其他方块右移得到相同的效果。
代码
CPP#include<iostream>
#include<cstring>
using namespace std;
struct Node{
int x, y, op;
};
Node b[10];
int a[10][10];
int n;
inline void down(){
for (int i = 1; i <= 5; i++){
int sz = 0;
for (int j = 1; j <= 7; j++)
if (a[i][j]) a[i][++sz] = a[i][j];
for (int j = sz + 1; j <= 7; j++) a[i][j] = 0;
}
}
inline bool del(){
int t[10][10];
memcpy(t, a, sizeof(a));
bool flag = false;
for (int i = 1; i <= 5; i++){
for (int j = 1; j <= 7; j++){
if (!a[i][j]) continue;
if (a[i][j] == a[i - 1][j] && a[i][j] == a[i + 1][j]){
t[i][j] = t[i - 1][j] = t[i + 1][j] = 0;
flag = true;
}
if (a[i][j] == a[i][j - 1] && a[i][j] == a[i][j + 1]){
t[i][j] = t[i][j - 1] = t[i][j + 1] = 0;
flag = true;
}
}
}
memcpy(a, t, sizeof(t));
return flag;
}
inline void dfs(int step){
down();
while (del()) down();
if (step > n){
for (int i = 1; i <= 5; i++)
if (a[i][1]) return;
for (int i = 1; i <= n; i++)
cout << b[i].x - 1 << " " << b[i].y - 1 << " " << b[i].op << endl;
exit(0);
}
int t[10][10];
memcpy(t, a, sizeof(a));
for (int i = 1; i <= 5; i++){
for (int j = 1; j <= 7; j++){
if (a[i][j] == 0) break;
if (i < 5){
swap(a[i][j], a[i + 1][j]);
b[step] = {i, j, 1};
dfs(step + 1);
memcpy(a, t, sizeof(t));
}
if (i > 1 && a[i - 1][j] == 0){
swap(a[i][j], a[i - 1][j]);
b[step] = {i, j, -1};
dfs(step + 1);
memcpy(a, t, sizeof(t));
}
}
}
}
int main(){
cin >> n;
for (int i = 1; i <= 5; i++){
for (int j = 1; j <= 8; j++){
int x;
cin >> x;
if (x == 0) break;
a[i][j] = x;
}
}
dfs(1);
cout << -1 << endl;
return 0;
}
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...