靶状数组题目链接
90分,而且超时很严重,与或运算不会23333333
int len=max(a1[0],b1[0])+1;
while(len>0 && !c[len]) len--;
printf("%d",c[len]);
for(int i=len-1;i>=1;i--)
{
printf("%03d",c[i]);
}
16:26:14
失落的羽翼 2017/2/5 16:26:14
#include <cstdio>
#include <iostream>
using namespace std;
int s[10][10]=
{
0,0,0,0,0,0,0,0,0,0,
0,6,6,6,6,6,6,6,6,6,
0,6,7,7,7,7,7,7,7,6,
0,6,7,8,8,8,8,8,7,6,
0,6,7,8,9,9,9,8,7,6,
0,6,7,8,9,10,9,8,7,6,
0,6,7,8,9,9,9,8,7,6,
0,6,7,8,8,8,8,8,7,6,
0,6,7,7,7,7,7,7,7,6,
0,6,6,6,6,6,6,6,6,6,
};
int g[10][10]=
{
0,0,0,0,0,0,0,0,0,0,
0,1,1,1,2,2,2,3,3,3,
0,1,1,1,2,2,2,3,3,3,
0,1,1,1,2,2,2,3,3,3,
0,4,4,4,5,5,5,6,6,6,
0,4,4,4,5,5,5,6,6,6,
0,4,4,4,5,5,5,6,6,6,
0,7,7,7,8,8,8,9,9,9,
0,7,7,7,8,8,8,9,9,9,
0,7,7,7,8,8,8,9,9,9,
};
int f1[10][10],f2[10][10],f3[10][10],t[10][10],tot=-1;//若木有答案输出-1
void dfs(int x,int y,int ans)
{
if(x==1&&y==10)//终止条件
{
tot=max(ans,tot);
return;
}
if(t[x][y]!=0)//之前有数已填入
{
if(x+1<=9) dfs(x+1,y,ans+s[x][y]*t[x][y]);//向右走
else dfs(1,y+1,ans+s[x][y]*t[x][y]);//去向下一行
}
else//无数
{
int k=g[x][y];
for(int i=1;i<=9;i++)
{
if(f1[x][i]==0&&f2[y][i]==0&&f3[k][i]==0)
{
f1[x][i]=1;
f2[y][i]=1;
f3[k][i]=1;
if(x+1<=9) dfs(x+1,y,ans+s[x][y]*i);
else dfs(1,y+1,ans+s[x][y]*i);//同上
f1[x][i]=0;
f2[y][i]=0;
f3[k][i]=0;
}
}
}
}
int main()
{
int i,j;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
{
scanf("%d",&t[i][j]);
int x=t[i][j];
f1[i][x]=1;
f2[j][x]=1;
int k=g[i][j];
f3[k][x]=1;//先标记上
}
dfs(1,1,0);
printf("%d",tot);
}
暴力大法好!!!