題目網址:https://www.luogu.com.cn/problem/P1074node
大意就是在一個9*9的數獨中填數,要求行列宮都是九個互不相同的數字,給定必定的得分機制,要求求解最大得分。思路大體從零最少的行開始搜索(試想現實中你作數獨必定是這樣的方法),而後只要將0位置的信息保存,總數就是深度值。按照優先搜索的順序逐個填寫,爲了節省計算資源,在搜索以前就預處理0位置的相關信息。ios
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef unsigned int ui; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define mem(a) memset(a,0,sizeof(a)) 7 #define prime1 1e9+7 8 #define prime2 1e9+9 9 #define scand(x) scanf("%llf",&x) 10 #define dbg(args) cout<<#args<<":"<<args<<endl; 11 #define pb(i) push_back(i) 12 #define ppb(x) pop_back(x) 13 #define scan(a) scanf("%d",&a) 14 #define pf printf 15 #define f(i,a,b) for(int i=a;i<=b;i++) 16 int n,init,tot,ans=-1,a[10][10],hang[10][10],lie[10][10],gong[10][10],s[100][5]; 17 //s[][0]保存行,s[][1]保存列,s[][2]保存宮,s[][3] 保存得分 18 struct node{ 19 int hang,zero_cnt; 20 }p[10]; 21 bool cmp(node& a, node& b) 22 { 23 return a.zero_cnt<b.zero_cnt; 24 } 25 26 int score(int x,int y) 27 { 28 if(x==5&&y==5)return 10; 29 else if(x>=4&&x<=6&&y>=4&&y<=6)return 9; 30 else if(x>=3&&x<=7&&y>=3&&y<=7)return 8; 31 else if(x>=2&&x<=8&&y>=2&&y<=8)return 7; 32 else return 6; 33 } 34 int which(int x,int y) 35 { 36 if(x>=1&&x<=3&&y>=1&&y<=3)return 1; 37 else if(x>=1&&x<=3&&y>=4&&y<=6)return 2; 38 else if(x>=1&&x<=3&&y>=7&&y<=9)return 3; 39 else if(x>=4&&x<=6&&y>=1&&y<=3)return 4; 40 else if(x>=4&&x<=6&&y>=4&&y<=6)return 5; 41 else if(x>=4&&x<=6&&y>=7&&y<=9)return 6; 42 else if(x>=7&&x<=9&&y>=1&&y<=3)return 7; 43 else if(x>=7&&x<=9&&y>=4&&y<=6)return 8; 44 else if(x>=7&&x<=9&&y>=7&&y<=9)return 9; 45 } 46 void dfs(int dep ,int sum)//搜索深度以及得分總數 47 { 48 if(dep==tot) 49 { 50 // dbg(sum); 51 if(sum>ans)ans=sum; 52 return ; 53 } 54 f(i,1,9)//在dep深度的位置填1-9的數字 55 { 56 //行列宮都不衝突 57 if(!hang[s[dep][0]][i]&&!lie[s[dep][1]][i]&&!gong[s[dep][2]][i]) 58 { 59 hang[s[dep][0]][i]=lie[s[dep][1]][i]=gong[s[dep][2]][i]=1; 60 dfs(dep+1,sum+i*s[dep][3]); 61 hang[s[dep][0]][i]=lie[s[dep][1]][i]=gong[s[dep][2]][i]=0; 62 } 63 } 64 return; 65 } 66 int main() 67 { 68 //freopen("input.txt","r",stdin); 69 //freopen("output.txt","w",stdout); 70 std::ios::sync_with_stdio(false); 71 f(i,1,9) 72 { 73 p[i].hang=i; 74 f(j,1,9) 75 { 76 scan(a[i][j]); 77 if(a[i][j]) 78 { 79 init+=a[i][j]*score(i,j); 80 hang[i][a[i][j]]=1; 81 lie[j][a[i][j]]=1; 82 gong[which(i,j)][a[i][j]]=1; 83 } 84 else 85 { 86 p[i].zero_cnt++; 87 } 88 } 89 } 90 91 sort(p+1,p+10,cmp); 92 93 f(i,1,9) 94 { 95 f(j,1,9) 96 { 97 if(a[p[i].hang][j]==0) 98 { 99 s[tot][0]=p[i].hang;//保存每一個零位置的行、列、宮以及得分,不然dfs中將會重複計算 100 s[tot][1]=j; 101 s[tot][2]=which(p[i].hang,j); 102 s[tot++][3]=score(p[i].hang,j); 103 } 104 } 105 } 106 // dbg(init); 107 //dbg(tot); 108 dfs(0,init);//從第0個零的位置開始搜索,初始得分爲init 109 pf("%d",ans); 110 return 0; 111 }