1. 程式人生 > >P1074 靶形數獨

P1074 靶形數獨

完全 names turn mes efi lin ring clu blog

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 靶形數獨