P1312 Mayan游戏 [模拟][搜索]
生活随笔
收集整理的這篇文章主要介紹了
P1312 Mayan游戏 [模拟][搜索]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
P1312 Mayan游戲
這道題跟斗地主都是大模擬啊!稍微掛一點可能就爆零了!
圖肯定能存,直接二維數組扔進去即可。
然后套dfs模板,搜索就先照那樣搜。
核心操作有兩個:一個是判斷那些塊可以消掉,一個是把那些可以消的消了。
第一個操作的核心代碼是這樣的:
for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(G[i][j] && i - 1 >= 1 && i + 1 <= 5 && G[i][j] == G[i + 1][j] && G[i][j] == G[i - 1][j]) {flag = true;vis[i][j] = vis[i - 1][j] = vis[i + 1][j] = true;for(int k = i - 2; k >= 1; k--) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}for(int k = i + 2; k <= 5; k++) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}}if(G[i][j] && j - 1 >= 1 && j + 1 <= 7 && G[i][j] == G[i][j - 1] && G[i][j] == G[i][j + 1]) {flag = true;vis[i][j] = vis[i][j - 1] = vis[i][j + 1] = true;for(int k = j - 2; k >= 1; k--) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}for(int k = j + 2; k <= 7; k++) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}}} }個人認為沒辦法用dfs去找可以消的塊,于是就用了這種暴力操作。
第二個操作比較麻煩,稍微寫錯就爆零了。。。
正確的解決思路是把可以消的點先全部弄掉,變成一副懸空的狀態。
之后再遍歷每一列,再從下往上遍歷,記錄當前遇到了幾個空氣,直接替換,原位置變成空氣即可。
還有一點難發現的:當新狀態出來之后,必須先掉下來,再判斷能否消除。
然后兩個部分就沒什么問題了。
但是這樣會TLE。我們需要剪枝!
代碼:
/*************************************************************************@Author: Garen@Created Time : Wed 30 Jan 2019 12:53:57 PM CST@File Name: P1312.cpp@Description:************************************************************************/ #include<bits/stdc++.h> using std::cin; using std::cout; using std::endl; const int maxn = 6, maxm = 8; int G[maxn][maxm]; int backup[maxn][maxn][maxm]; struct Nodes {int x, y, g;Nodes(int x, int y, int g): x(x), y(y), g(g) {} }; std::vector<Nodes> answers; bool vis[maxn][maxm]; int n;void copy_one(int t) {for(int i = 1; i <= 5; i++) for(int j = 1; j <= 7; j++) backup[t][i][j] = G[i][j]; } void copy_two(int t) {for(int i = 1; i <= 5; i++) for(int j = 1; j <= 7; j++) G[i][j] = backup[t][i][j]; } bool find() {bool flag = false;for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(G[i][j] && i - 1 >= 1 && i + 1 <= 5 && G[i][j] == G[i + 1][j] && G[i][j] == G[i - 1][j]) {flag = true;vis[i][j] = vis[i - 1][j] = vis[i + 1][j] = true;for(int k = i - 2; k >= 1; k--) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}for(int k = i + 2; k <= 5; k++) {if(G[i][j] == G[k][j]) vis[k][j] = true;else break;}}if(G[i][j] && j - 1 >= 1 && j + 1 <= 7 && G[i][j] == G[i][j - 1] && G[i][j] == G[i][j + 1]) {flag = true;vis[i][j] = vis[i][j - 1] = vis[i][j + 1] = true;for(int k = j - 2; k >= 1; k--) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}for(int k = j + 2; k <= 7; k++) {if(G[i][j] == G[i][k]) vis[i][k] = true;else break;}}}}if(!flag) return false;for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(vis[i][j]) {vis[i][j] = G[i][j] = 0;}}}return true; } void update() {for(int i = 1; i <= 5; i++) {int now = 0;for(int j = 1; j <= 7; j++) {if(!G[i][j]) now++;else {if(!now) continue;G[i][j - now] = G[i][j]; G[i][j] = 0;}}} } bool empty() {for(int i = 1; i <= 5; i++) if(G[i][1]) return false;return true; } void dfs(int t) {if(t == n) {if(empty()) {for(auto it : answers) cout << it.x << ' ' << it.y << ' ' << it.g << endl;exit(0);}return;}copy_one(t);for(int i = 1; i <= 5; i++) {for(int j = 1; j <= 7; j++) {if(G[i][j]) {// rightif(i + 1 <= 5 && G[i][j] != G[i + 1][j]) {std::swap(G[i][j], G[i + 1][j]);answers.push_back(Nodes(i - 1, j - 1, 1));update();while(find()) update();dfs(t + 1);copy_two(t);answers.pop_back();}// leftif(i - 1 >= 1 && G[i - 1][j] == 0) {std::swap(G[i][j], G[i - 1][j]);answers.push_back(Nodes(i - 1, j - 1, -1));update();while(find()) update();dfs(t + 1);copy_two(t);answers.pop_back();}}}} } int main() {cin >> n;for(int i = 1; i <= 5; i++) {int temp;for(int j = 1; ; j++) {cin >> temp;if(temp) G[i][j] = temp;else break;}}dfs(0);cout << -1 << endl;return 0; }轉載于:https://www.cnblogs.com/Garen-Wang/p/10349366.html
總結
以上是生活随笔為你收集整理的P1312 Mayan游戏 [模拟][搜索]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS中的position定位
- 下一篇: IT是产品、IT是服务、IT是能力