#include<bits/stdc++.h>
using namespace std;
int a[42][6],dp[42][42][42][42],baslen[42][42][42][42],basket[42][42][42][42][6];
bool b[42][42][42][42];
void cal1(int i,int j,int q,int p){
if(i==0)return;
if(baslen[i-1][j][q][p]==5||b[i-1][j][q][p]==0)return;
int len,t[6];
for(len=1;len<=baslen[i-1][j][q][p];len++)
t[len]=basket[i-1][j][q][p][len];
t[len]=a[i][1];
int ok=0,bj1=0,bj2=0;
for(int k1=1;k1<len;k1++)
for(int k2=k1+1;k2<=len;k2++)
if(t[k1]==t[k2]){
ok=1;
bj1=k1;
bj2=k2;
}
if(dp[i-1][j][q][p]+ok>dp[i][j][q][p]||dp[i][j][q][p]==0){
dp[i][j][q][p]=dp[i-1][j][q][p]+ok;
baslen[i][j][q][p]=0;
for(int k=1;k<=len;k++)
if(k!=bj1&&k!=bj2)
basket[i][j][q][p][++baslen[i][j][q][p]]=t[k];
}
}
void cal2(int i,int j,int q,int p){
if(j==0)return;
if(baslen[i][j-1][q][p]==5||b[i][j-1][q][p]==0)return;
int len,t[6];
for(len=1;len<=baslen[i][j-1][q][p];len++)
t[len]=basket[i][j-1][q][p][len];
t[len]=a[j][2];
int ok=0,bj1=0,bj2=0;
for(int k1=1;k1<len;k1++)
for(int k2=k1+1;k2<=len;k2++)
if(t[k1]==t[k2]){
ok=1;
bj1=k1;
bj2=k2;
}
if(dp[i][j-1][q][p]+ok>dp[i][j][q][p]||dp[i][j][q][p]==0){
dp[i][j][q][p]=dp[i][j-1][q][p]+ok;
baslen[i][j][q][p]=0;
for(int k=1;k<=len;k++)
if(k!=bj1&&k!=bj2)
basket[i][j][q][p][++baslen[i][j][q][p]]=t[k];
}
}
void cal3(int i,int j,int q,int p){
if(q==0)return;
if(baslen[i][j][q-1][p]==5||b[i][j][q-1][p]==0)return;
int len,t[6];
for(len=1;len<=baslen[i][j][q-1][p];len++)
t[len]=basket[i][j][q-1][p][len];
t[len]=a[q][3];
int ok=0,bj1=0,bj2=0;
for(int k1=1;k1<len;k1++)
for(int k2=k1+1;k2<=len;k2++)
if(t[k1]==t[k2]){
ok=1;
bj1=k1;
bj2=k2;
}
if(dp[i][j][q-1][p]+ok>dp[i][j][q][p]||dp[i][j][q][p]==0){
dp[i][j][q][p]=dp[i][j][q-1][p]+ok;
baslen[i][j][q][p]=0;
for(int k=1;k<=len;k++)
if(k!=bj1&&k!=bj2)
basket[i][j][q][p][++baslen[i][j][q][p]]=t[k];
}
}
void cal4(int i,int j,int q,int p){
if(p==0)return;
if(baslen[i][j][q][p-1]==5||b[i][j][q][p-1]==0)return;
int len,t[6];
for(len=1;len<=baslen[i][j][q][p-1];len++)
t[len]=basket[i][j][q][p-1][len];
t[len]=a[p][4];
int ok=0,bj1=0,bj2=0;
for(int k1=1;k1<len;k1++)
for(int k2=k1+1;k2<=len;k2++)
if(t[k1]==t[k2]){
ok=1;
bj1=k1;
bj2=k2;
}
if(dp[i][j][q][p-1]+ok>dp[i][j][q][p]||dp[i][j][q][p]==0){
dp[i][j][q][p]=dp[i][j][q][p-1]+ok;
baslen[i][j][q][p]=0;
for(int k=1;k<=len;k++)
if(k!=bj1&&k!=bj2)
basket[i][j][q][p][++baslen[i][j][q][p]]=t[k];
}
}
int main(){
int n,i,j,q,p,ans;
while(scanf("%d",&n)&&n){
for(i=1;i<=n;i++)
for(j=1;j<=4;j++)
scanf("%d",&a[i][j]);
ans=0;
memset(dp,0,sizeof(dp));
memset(b,0,sizeof(b));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
for(q=0;q<=n;q++)
for(p=0;p<=n;p++){
if(i==0&&j==0&&q==0&&p==0){b[i][j][q][p]=1;continue;}
baslen[i][j][q][p]=0;
cal1(i,j,q,p);
cal2(i,j,q,p);
cal3(i,j,q,p);
cal4(i,j,q,p);
if(dp[i][j][q][p]==0&&baslen[i][j][q][p]==0)continue;
b[i][j][q][p]=1;
ans=max(dp[i][j][q][p],ans);
}
printf("%d\n",ans);
}
return 0;
}
UVA 10118 Free Candies
最新推荐文章于 2020-01-22 18:49:53 发布