zoukankan      html  css  js  c++  java
  • 靶状数独

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

    暴力大法好!!!

  • 相关阅读:
    条件编译中的基本语法
    UITableView中headerView视察滚动的简单实现
    CocoaPods使用简单回顾
    CocoaPods第三方类库管理工具的简单使用
    Xcode中release和debug模式
    转:关于LazyTableImage
    汉字与UTF-8编码之间的转换
    结构体与字符串之间的转换
    MFC中小笔记(二)
    升级 WIN8.1 VC6.0和 Visual Assist 的使用问题
  • 原文地址:https://www.cnblogs.com/ht008/p/6819849.html
Copyright © 2011-2022 走看看