1. 程式人生 > 其它 >計蒜客 A1627 連連看 暴力搜尋

計蒜客 A1627 連連看 暴力搜尋

技術標籤:搜尋

題目描述

原題連結

連連看是一款非常有意思的遊戲。
在這裡插入圖片描述
我們可以把任意兩個在圖的在邊界上的相同的方格一起消掉,比如把兩個 4 4 4消掉以後
在這裡插入圖片描述
在這裡插入圖片描述
每次消掉兩個方格的時候,都有會獲得一個分數,第 i i i 次消的分數為 i × i× i×方格的值。比如上面的消法,是第一次消,獲得的分數為 1 × 4 = 4 1×4=4 1×4=4
請你幫忙最優操作情況下,獲得的分數最多為多少。

分析

結果填空題, 不用考慮時間複雜度,直接暴力搜尋
注意, 每次只能消掉邊界上值相同的兩個格子

答案

分數最大為 89 89

89

實現

// 跑了十多分鐘還沒有跑完, 複雜度實在太高了, 應該還可以剪枝
// 答案一直停留在89
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int map[4][4] = {{1,4,2,5},{2,1,2,1},{3,1,3,2},{2,5,3,4}};
bool vis[4][4]; // 是否已經被消除
int dx[] = {0,1,0,-1}, dy[] = {1,0,-1,0};
int ans =
-1; bool check(int x, int y) // 檢查當前格子是否為邊界 { if(vis[x][y]) return false; // 格子已經被消除過 for(int i=0; i<4; i++) { int nx = x + dx[i], ny = y + dy[i]; if(nx < 0 || nx >= 4 || ny < 0 || ny >= 4) return true; // 上下左右的格子存在出界的情況, 則當前的格子一定是邊界 if(vis[nx][ny]) return true
; // 上下左右的格子存在被消除的情況, 則當前的格子一定是邊界 } return false; } void dfs(int step, int score) { cout << ans << endl; ans = max(ans, score); // 更新最高得分 for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { if(!check(i,j)) continue; // 遍歷整個地圖, 先找到一個為邊界的格子 for(int k=0; k<4; k++) { for(int p=0; p<4; p++) { if((i==k && j==p) || !check(k,p) || map[i][j] != map[k][p]) continue; // 再遍歷整個地圖, 找到一個和[i,j]值相等且為邊界的格子 vis[i][j] = vis[k][p] = 1; dfs(step+1,score + step*map[i][j]); vis[i][j] = vis[k][p] = 0; // 回溯 } } } } return; } int main() { dfs(1,0); cout << ans << endl; return 0; }