P1074 靶形數獨 dfs 預處理

2022-06-03 10:30:20 字數 1253 閱讀 8902

顯然是dfs 而且沒有什麼剪枝記憶化之類的 但是預處理比較麻煩

我用三個二維陣列存狀態:visx[x][i]代表x行有沒有選 i 這個數   visy[y][i]代表y列有沒有選 i    visg[g][i]代表第g個九宮格有沒有選i

當遍歷的時候 發現visx[x][i]==0&&visy[y][i]==0&&visg[g][i]==0 說明 i 還沒有被選 就可以向下dfs

至於遍歷的順序 我們玩數獨的時候都知道 肯定先從已知點比較多的地方開始考慮

比如 第一行:7 0 0 9 0 0 0 0 1 有6個位置未知

第九行:0 8 0 5 0 4 0 1 2 只有4個位置未知 那麼我們肯定先考慮第九行

所以只需要把行sort排序一下 調整一下遍歷的順序即可

不過排序又引申出來乙個問題 就是我們不知道排序之後的第一行 原來是第幾行 為了解決這個問題 我們可以用乙個結構體儲存每一行有幾個未知位置:

typedef struct

node;

最後 我們需要維護乙個一維陣列,用來儲存修正後的遍歷的序列(當然二維也可以)

最後的的最後 每找到一組數獨的解 都要更新最大值

具體看**吧:

#includeusing

namespace

std;

typedef

struct

node;

node e[

15];

int m[15][15],anss,u,visx[15][15],visy[15][15],visg[15][15],q[100

],pre,flag;

int s[11][11]=;

bool

cmp(node a,node b)

void dfs(int

t)

int x=(q[t]-1)/9+1

;

int y=q[t]-(x-1)*9

;

int g=((x-1)/3)*3+(y-1)/3+1

;

for(i=1;i<=9;i++)

}}int

main()

}sort(e+1,e+10

,cmp);

for(i=1;i<=9;i++)

for(j=1;j<=9;j++)

}dfs(1);

if(flag==0) //

如果無解

cout

}

P1074 靶形數獨

小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 999 格寬 999 格高的大九宮格中有 ...

P1074 靶形數獨

p1074 靶形數獨 比賽的要求是 每個人必須完成乙個給定的數獨 每個給定數獨可能有不同的填法 而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和 輸入格式 一共 99 行。每行99個整數 每個數都在 0 9的範圍內 表示乙個尚未填滿的數獨方格,未填...

P1074 靶形數獨

題意 給你乙個未完成的數獨,每個位置上的價值等於數字乘上位置的價值 類似於打靶子 要點 1.巧妙利用打表便於搜尋與判斷 2.貪心思想大量減少搜尋的分支 每行 列 選0的個數少的填,減少了分支 不加此剪枝tle一片。1 剛開始別忘了加上初始的數的value 2 打表注意 0 0 都是 0,因為打錯表找...