用 dfs 求解,每一次搜索,找到两个相同的边界点,标记即可。检测边界点的方法也很简单,只需要一个点的四个方向中有一个点在地图外或者已经被标记,那么这个点就是边界点。
•检测边界点的方法也很简单,只需要一个点的四个方向中有一个点在地图外或者已经被标记,那么这个点就是边界点。
•答案是 89,不要手算,手算很难找到最优解。最优的消除方案为
•检测边界点的方法也很简单,只需要一个点的四个方向中有一个点在地图外或者已经被标记,那么这个点就是边界点。
•答案是 89,不要手算,手算很难找到最优解。最优的消除方案为
(2 2)、(1 1)、(1 1)、(3 3)、(4 4)、(5 5)。
#include<stdio.h>
int max=0;
int a[21][21]={{1,4,2,5},
{2,1,2,1},
{3,1,3,2},
{2,5,3,4}
};
int vis[21][21]={0};
int n;
int dir[4][2]={0,-1,0,1,-1,0,1,0};
int in(int x,int y){
if(x>=0&&x<n&&y>=0&&y<n){
return 1;
}
return 0;
}
int check(int x,int y){
if(!vis[x][y]){
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(!in(dx,dy)){
return 1;
}
if(vis[dx][dy])return 1;
}
}
return 0;
}
void dfs(int step,int sum){
if(sum>max){
max=sum;
// printf("%d\n",max);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(check(i,j)){
for(int p=0;p<n;p++){
for(int q=0;q<n;q++){
if(p==i&&q==j)continue;
if(check(p,q)&&a[i][j]==a[p][q]){
vis[i][j]=vis[p][q]=1;
dfs(step+1,sum+step*a[i][j]);
vis[i][j]=vis[p][q]=0;
}
}
}
}
}
}
}
int main(){
scanf("%d",&n);
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++) {
scanf("%d",&a[i][j]);
}
} */
dfs(1,0);
printf("%d\n",max);
return 0;
}