LuoguP1074 靶形數獨 搜尋

2022-05-01 20:09:11 字數 1581 閱讀 3668

題目鏈結

資料範圍:略。

題解

傳說中的大爆搜題啊。

我覺得這種題就是你能想到什麼優化就直接上什麼優化....

這個題我們就貪心的選行,就是按照每行$0$的個數從小到大排序依次填。

然後我們填的時候需要記錄:當前要填的數,在行、列、九宮格裡是否出現過即可。

還有,分數是$5\sim 10$,不是$1$到$5$.....

**

#include #define n 110 

using namespace std;

char *p1, *p2, buf[100000];

#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? eof : *p1 ++ )

int rd()

while (c > 47)

return x * f;

}struct node ;

inline bool cmp(const node &a, const node &b)

const int n = 9;

inline int id(node a)

inline int id(int x, int y)

inline node rz(int x) ;

}inline int bid(int al)

int map[n], q[n], score[n], ans = 0, fil[n];

bool vis[3][10][10];

node b[11];

void dfs(int k)

} // for (int i = 1; i <= n; i ++ )

// puts("");

// }

// puts("");

ans = max(ans, sum);

return;

} int x = rz(q[k]).x, y = rz(q[k]).y;

// printf("%d %d\n", x, y);

if (!map[id(x, y)])

} }else

}int main()

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

} }sort(b + 1, b + n + 1, cmp);

for (int i = 1; i <= n; i ++ )

} // init_score

for (int i = 1; i <= n; i ++ )

} for (int i = 1; i <= 5; i ++ )

} }// for (int i = 1; i <= n; i ++ )

// puts("");

// }

dfs(1);

if (!ans)

else

return 0;

}

Luogu P1074 靶形數獨

include using namespace std struct consult row 0 struct consult row 0 dic row 0 10 查詢第幾行有幾個0 int origin 10 10 輸入的數獨 bool row 10 10 column 10 10 box 10...

luogu P1074 靶形數獨

比較基礎的搜尋剪枝題。幾個優化就可以過了 用lowbit代替查詢可以填的數 用並集來維護什麼數不能填 優先考慮 最小可能性的位置 講道理我用堆維護還t了。然後就可以在 m n是數獨大小,m是可以填的種類數量 解決 實際測試中,遠遠不到這個上界 include using namespace std ...

luogu P1074 靶形數獨

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