这道题属于找规律的题目
开始时,我犹豫了很久,一方面,我不太确定三排数字应该对应哪个方向,后来稍微一想才明白方向无关紧要。另一方面,不确定是不是必须每行的数字都必须相等才能得到最大解,这个犹豫的时间比较长,看上去是的,但不知道怎么证明,只好先进行尝试,发现的确如此,不知道有没有人能给出证明
然后用dfs尝试,结果一直超时,后来,打印了一下dfs的详细情况,发现以下规律:
1、最小的都在中间。
2、其他两个各占两个。
3、各个方向上数值大小的排列情况不能是一样的。
poj上不用考虑3就能过,对poj实在感到很无语。。。uva上必须加第三条。
上渣代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int field[19][3],x[3][5],input[3][3],vis[3][3],amount[5]={3,4,5,4,3},big,time[3][3];
int input1[10000][3][3],input2=0,output[10000],a[3][5];
void judge()
{
int i,j,k,all=0,flag=0,sum=0;
/*for(i=0;i<3;i++)
{
for(j=i+2;j>=0;j--)
{
field[all][0]=x[0][j];
field[all][1]=x[1][i];
field[all++][2]=x[2][i+2-j];
}
}
for(i=3;i<5;i++)
{
for(j=i-2;j<5;j++)
{
field[all][0]=x[0][j];
field[all][1]=x[1][i];
field[all++][2]=x[2][i+2-j];
}
}
for(i=0;i<18;i++)
{
for(j=i+1;j<19;j++)
{
if(memcmp(field[i],field[j],12)==0)
{
flag=1;
goto next;
}
}
}*/
next:;
if(flag==0)
{
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
sum+=x[i][j]*amount[j];
}
}
if(sum>big)
{
big=sum;
}
}
int judge1(int which)
{
int i,j,t;
if(which==1)
{
if(memcmp(a[0],a[1],20)==0)
return 1;
else
return 0;
}
else if(which==2)
{
if(memcmp(a[0],a[2],20)==0||memcmp(a[1],a[2],20)==0)
return 1;
else
return 0;
}
return 0;
}
void dfs(int index,int whichrow)
{
int i,j;
if(index==5)
{
if(judge1(whichrow))
return ;
if(whichrow==2)
{
judge();
}
else
dfs(0,whichrow+1);
return ;
}
if(index==2)
{
dfs(index+1,whichrow);
return ;
}
for(i=1;i<3;i++)
{
if(time[whichrow][i]<2&&amount[index]+vis[whichrow][i]<=9)
{
a[whichrow][index]=i;
x[whichrow][index]=input[whichrow][i];
vis[whichrow][i]+=amount[index];
time[whichrow][i]++;
dfs(index+1,whichrow);
x[whichrow][index]=0;//可有可无
vis[whichrow][i]-=amount[index];
time[whichrow][i]--;
}
}
}
int main()
{
int n,i,j,help=1;;
scanf("%d",&n);
while(n--)
{
printf("Test #%d\n",help++);
memset(vis,0,36);
memset(time,0,36);
memset(a,0,60);
big=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
scanf("%d",&input[i][j]);
}
if(i==input2)
memcpy(input1[input2],input,36);
for(i=0;i<3;i++)
sort(input[i],input[i]+3);
for(i=0;i<3;i++)
{
vis[i][0]+=5;
x[i][2]=input[i][0];
}
dfs(0,0);
printf("%d\n\n",big);
output[input2++]=big;
next:;
}
return 0;
}