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 }