題目**:
大意就是在乙個9*9的數獨中填數,要求行列宮都是九個互不相同的數字,給定一定的得分機制,要求求解最大得分。思路大致從零最少的行開始搜尋(試想現實中你做數獨一定是這樣的方法),然後只要將0位置的資訊儲存,總數就是深度值。按照優先搜尋的順序逐個填寫,為了節省計算資源,在搜尋之前就預處理0位置的相關資訊。
1 #include2using
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<<":"<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++)
16int 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] 儲存得分
18struct
nodep[10
];21
bool cmp(node& a, node&b)
2225
26int score(int x,int
y) 27
34int which(int x,int
y)35
46void dfs(int dep ,int sum)//
搜尋深度以及得分總數
4754 f(i,1,9)//
在dep深度的位置填1-9的數字
5563}64
return;65
}66intmain()
6784
else
8588}89
}
9091 sort(p+1,p+10
,cmp);
9293 f(i,1,9)94
104}
105}
106//
dbg(init);
107//
dbg(tot);
108 dfs(0,init);//
從第0個零的位置開始搜尋,初始得分為init
109 pf("%d"
,ans);
110return0;
111 }
洛谷 P1074 靶形數獨
p1074 靶形數獨 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高...
洛谷P1074 靶形數獨
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高的大九宮格中有 9 個...
洛谷P1074 靶形數獨
這道題單獨以每個位置遞迴純暴力搜尋的話,複雜度9 81,考慮剪枝,和八皇后類似,在同一行同一列同一宮則不能放。另外,想象解答樹,先搜尋情況少的位置和先搜尋情況多的位置總結點數是一樣的,不一樣的地方在於先搜情況少的的話,靠近樹根的分叉少,靠近枝葉稠密,若先搜情況多的,則樹根處稠密,枝葉稀疏。考慮剪枝,...