題目的一些資訊就不給了,點鏈結吧。
解題思路:
我總結為乙個要點,乙個優化:
要點:搜尋順序不能
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...