5 条题解
-
3
#include <bits/stdc++.h> #define LL long long using namespace std; const int N = 1e6 + 10; const int INF = 0x3f3f3f3f; int a[15][15]; int c[12],r[12],g[12]; int st[511]; string s; void init() { memset(a,0,sizeof(a)); for (int i=0;i<=9;i++) c[i] = r[i] = g[i] = 511; } int find(int x,int y) { return r[x] & c[y] & g[ x/3*3 + y/3]; } bool dfs() { int ans = 10; int x,y; for (int i=0;i<9;i++) { for (int j=0;j<9;j++) { if(a[i][j] == 0) { int num = st[find(i,j)]; if(num < ans) ans = num, x = i,y = j; } } } if(ans == 10) return true; int p = find(x,y); for (int i=0;i<9;i++) { int num = 1 << i; if(num & p) { r[x] -= num; c[y] -= num; g[ x/3*3 + y/3] -= num; a[x][y] = i + 1; if(dfs()) return true; r[x] += num; c[y] += num; g[ x/3*3 + y/3] += num; a[x][y] = 0; } } return false; } int main() { for (int i=0;i<512;i++) { int f = i; while(f) { st[i] ++; f -= (f&-f); } } while(cin >> s && s != "end") { init(); for (int i=0;i<81;i++) { a[i/9][i%9] = (s[i] == '.' ? 0 : s[i] - 48); } for (int i=0;i<9;i++) { for (int j=0;j<9;j++) { if(a[i][j] != 0) { int num = 1 << (a[i][j] - 1); r[i] -= num; c[j] -= num; g[i/3*3 + j/3] -= num; } } } dfs(); for (int i=0;i<9;i++) { for (int j=0;j<9;j++) { cout << a[i][j]; } } cout << endl; } return 0; }
```‸
信息
- ID
- 77
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 272
- 已通过
- 101
- 上传者