连连看是一款非常有意思的游戏。
我们可以把任意两个在图的在边界上的相同的方格一起消掉,比如把两个 444 消掉以后,

每次消掉两个方格的时候,都有会获得一个分数,第 iii 次消的分数为 i×i \timesi× 方格的值。比如上面的消法,是第一次消,获得的分数为 1×4=41 \times 4 = 41×4=4。
请你帮忙最优操作情况下,获得的分数最多为多少。
Java代码
ackage 模拟赛5;
public class l3 {
static int a[][]={
{1,4,2,5},
{2,1,2,1},
{3,1,3,2},
{2,5,4,3},
};
static int dir[][]={
{-1,0},
{1,0},
{0,-1},
{0,1},
};
static boolean visited[][]=new boolean[4][4];
static int max=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
dfs(1,0);
System.out.println(max);
}
public static void dfs(int step,int s)
{
if(s>max)
{
max=s;
}
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
for(int q=0;q<a.length;q++)
{
for(int p=0;p<a.length;p++)
{
if(i==q&&j==p) continue;
if(a[i][j]==a[q][p]&&check(i,j)&&check(q,p))
{
visited[i][j]=visited[q][p]=true;
int k =s+a[i][j]*step;
dfs(step+1,k);
visited[i][j]=visited[q][p]=false;;
}
}
}
}
}
}
public static boolean check(int i,int j)
{
if(visited[i][j]==true)
return false;
for(int k=0;k<4;k++)
{
int xx=i+dir[k][0];
int yy=j+dir[k][1];
if(isout(xx,yy))
{
return true;
}
if(visited[xx][yy]==true)
return true;
}
return false;
}
public static boolean isout(int xx,int yy)
{
if(xx>3||xx<0||yy>3||yy<0)
return true;
return false;
}
}