P1074 靶形数独

Posted WeiAR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1074 靶形数独相关的知识,希望对你有一定的参考价值。

P1074 靶形数独
正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<set>
  8 #include<map>
  9 #include<stack>
 10 #include<cstring>
 11 #define inf 2147483647
 12 #define For(i,a,b) for(register int i=a;i<=b;i++)
 13 #define p(a) putchar(a)
 14 #define g() getchar()
 15 //by war
 16 //2017.11.7
 17 using namespace std;
 18 bool xuse[10][10],yuse[10][10];
 19 int a[10][10];
 20 int ans,n=8;
 21 int tot;
 22 void in(int &x)
 23 {
 24     char c=g();x=0;
 25     while(c<0||c>9)c=g();
 26     while(c<=9&&c>=0)x=(x<<1)+(x<<3)+c-0,c=g();
 27 }
 28 void o(int x)
 29 {
 30     if(x>9)o(x/10);
 31     p(x%10+0);
 32 }
 33 
 34 inline bool test(register int step,register int num)
 35 {
 36     register int x=(step/9)/3*3;
 37     register int y=(step%9)/3*3;
 38     For(i,0,2)
 39       For(j,0,2)
 40         if(a[x+i][y+j]==num)
 41         return false;
 42         return true;
 43 }
 44 
 45 inline int get()
 46 {
 47     int cnt=0;
 48     int t=5;
 49     For(len,0,4)
 50     {
 51         t++;
 52         For(j,len,n-len)
 53         cnt+=a[len][j]*t;
 54         if(len==4)
 55         break;
 56         For(j,len,n-len)
 57         cnt+=a[n-len][j]*t;
 58         
 59         For(i,len+1,n-len-1)
 60         cnt+=a[i][len]*t;
 61         
 62         For(i,len+1,n-len-1)
 63         cnt+=a[i][n-len]*t;
 64     }
 65     return cnt;
 66 }
 67 
 68 inline void dfs(register int step)
 69 {
 70     if(step==81)
 71     {
 72     ans=max(get(),ans);
 73     tot++;
 74     return;
 75     }
 76     if(a[step/9][step%9]!=0)
 77     dfs(step+1);
 78     else 
 79     for(register int i=9;i>=1;i--)
 80     {
 81         if(!xuse[step/9][i]&&!yuse[step%9][i]&&test(step,i))
 82         {
 83             a[step/9][step%9]=i;
 84             xuse[step/9][i]=true;
 85             yuse[step%9][i]=true;
 86             dfs(step+1);
 87             a[step/9][step%9]=0;
 88             xuse[step/9][i]=false;
 89             yuse[step%9][i]=false;
 90         }
 91     }
 92 }
 93 
 94 int main()
 95 {
 96     for(register int i=8;i>=0;i--)
 97       For(j,0,8)
 98         {
 99             in(a[i][j]);
100             if(a[i][j]!=0)
101             {
102                 xuse[i][a[i][j]]=true; 
103                 yuse[j][a[i][j]]=true;
104             }
105         }
106     dfs(0);
107     if(ans!=0)
108     o(ans);
109     else
110     puts("-1");
111      return 0;
112 }

 

以上是关于P1074 靶形数独的主要内容,如果未能解决你的问题,请参考以下文章

洛谷—— P1074 靶形数独

P1074 靶形数独

洛谷P1074 靶形数独

P1074 靶形数独题解

luogu P1074 靶形数独

洛谷P1074 靶形数独 [搜索]