NOIP 2009 靶形數獨題解

2022-05-15 07:42:11 字數 1495 閱讀 1453

題目的一些資訊就不給了,點鏈結吧。

解題思路:

我總結為乙個要點,乙個優化:

要點:搜尋順序不能

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

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

這樣時間複雜度過不去。

如何搜尋?

當做填數字一樣,每乙個格仔列舉陣列,從上到下,從左到右填過去。

優化:這真的是欺負我這種沒有玩過數獨的人。

從已經填數字多的一行填,對行排個序,雖然每個格仔都要填,這樣每個格仔能夠搜尋的狀態數總體變少了,就行了。

**:

#include#include

#include

#include

#define r register int

#define l inline int

using

namespace

std;

const

int n=10

;int

a[n][n],line[n][n],list[n][n],nine[n][n];

intans,flag,ned,cnt;

struct

to[n*n];

bool

cmp(t qq,t ee)

l judge(r x,r y)

if(x<=6&&x>=4

)

else

}l pd(r x,r y)

inline

void

dfs(r num,r tot,r x,r y)

if(y==10

) dfs(num,tot,x+1,1

);

else

if(a[o[x].p][y])

dfs(num,tot,x,y+1

);

else

dfs(num+1,tot+i*pd(o[x].p,y),x,y+1

); line[o[x].p][i]=list[y][i]=nine[root][i]=0

; }}}

}int

main()

}sort(o+1,o+9+1

,cmp);

ned=ans;

dfs(cnt,ned,

1,1);

if(!flag)

printf("-1

");else

printf("%d

",ans);

return0;

}

NOIP2009 靶形數獨 題解

題目名稱 靶形數獨 題目 noip2009 時間限制 2000ms 空間限制 128m 問題描述 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向z博士請教,z博士拿出了他最近發明的 靶形數獨 作為這兩個...

noip2009靶形數獨題解

靶形數獨是乙個經典的np完全問題,沒有多項式演算法,顯然需要搜尋,遞迴回溯會優於列舉。然而此題資料範圍大,如果樸素搜尋顯然肯定tle,於是我們就需要一些優化。1.在搜尋中,每次我們都需要查詢當前格仔的可填數字,如果用二進位制數集儲存的話,可以大大減少執行時間。對於乙個格仔 x,y 可選數字為x行 y...

NOIP2009 靶形數獨

爆搜沒什麼好說的。剪枝思路 一開始將每個點可能取的值的數量統計出,排序,從小到大搜 然後貪心可行性 就是剩下的地方都填9,得分10 不過在vj上測85。日。加了卡時,2e7次之內跳出,總算過了。include include include include include include inclu...