题目链接: https://nanti.jisuanke.com/t/25086
这道题要用dfs去搜,只需要找到两个相同的数并且这两个数在边界,就可以消除,要判断是不是在边界的话只需要判断这个点的其他四个方向有任意一个在边界外面或者已经被标记过了,就说明这个点处于边界。
实现代码:
#include <bits/stdc++.h>
#define Max(a,b) a>b?a:b
using namespace std;
int MAP[4][4] = {1,4,2,5,2,1,2,1,3,1,3,2,2,5,3,4};
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
bool vis[5][5];
int ans;
bool fun(int x,int y){
return x<0||y<0||x>=4||y>=4;
}
bool Check(int x,int y){
if(vis[x][y])return false;
for(int i=0;i<4;i++){
int X = x + dir[i][0];
int Y = y + dir[i][1];
if(fun(X,Y))return true;
if(vis[X][Y])return true;
}
return false;
}
void dfs(int step,int sum){
ans = Max(ans,sum);
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 l=0;l<4;l++){
if(k==i && l==j)continue;
if(MAP[i][j] == MAP[k][l] && Check(k,l)){
vis[i][j] = vis[k][l] = 1;
dfs(step+1,sum + step*MAP[i][j]);
vis[i][j] = vis[k][l] = 0;
}
}
}
}
}
}
int main()
{
ans = 0;
memset(vis,0,sizeof(vis));
dfs(1,0);
printf("%d\n",ans);
return 0;
}