靶状数组题目链接
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);
}

暴力大法好!!!