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);
    }

    暴力大法好!!!

  • 相关阅读:
    android 样式开发
    Android studio 开发环境搭建
    nodejs+express 4.x笔记
    C#: switch语句的重构『网摘』
    从实例谈OOP、工厂模式和重构
    ASP.NET FileUpload 上传文件类型验证
    asp.net 网页中播放 flash 和flv
    数据库设计中主键问题
    修改Sqlserver实例默认排序规则
    查看sqlserver被锁的表以及如何解锁
  • 原文地址:https://www.cnblogs.com/ht008/p/6819849.html
Copyright © 2011-2022 走看看