洛谷1074 靶狀數獨dfs 排序 記錄 搜尋

2022-05-20 12:34:27 字數 1578 閱讀 1903

題目**:

大意就是在乙個9*9的數獨中填數,要求行列宮都是九個互不相同的數字,給定一定的得分機制,要求求解最大得分。思路大致從零最少的行開始搜尋(試想現實中你做數獨一定是這樣的方法),然後只要將0位置的資訊儲存,總數就是深度值。按照優先搜尋的順序逐個填寫,為了節省計算資源,在搜尋之前就預處理0位置的相關資訊。

1 #include2

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<<":"<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,考慮剪枝,和八皇后類似,在同一行同一列同一宮則不能放。另外,想象解答樹,先搜尋情況少的位置和先搜尋情況多的位置總結點數是一樣的,不一樣的地方在於先搜情況少的的話,靠近樹根的分叉少,靠近枝葉稠密,若先搜情況多的,則樹根處稠密,枝葉稀疏。考慮剪枝,...