題目鏈結:
資料範圍:略。
題解:
傳說中的大爆搜題啊。
我覺得這種題就是你能想到什麼優化就直接上什麼優化....
這個題我們就貪心的選行,就是按照每行$0$的個數從小到大排序依次填。
然後我們填的時候需要記錄:當前要填的數,在行、列、九宮格裡是否出現過即可。
還有,分數是$5\sim 10$,不是$1$到$5$.....
**:
#include #define n 110using 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...