5 条题解
-
0
#include<iostream> #include<cstdio> #include<iomanip> #include<cmath> #include<bits/stdc++.h> #include<algorithm> #include<cstring> #include<string> #include<stack> #include<queue> #define LL long long using namespace std; const int INF=0x3f3f3f3f; const int N=1e5+10; string s; int a[15][15]; int h[15],l[15],g[15]; int sum[520]; void init() { for(int i = 0 ; i < 10 ; i++) h[i] = l[i] = g[i] = 511; } int find(int i, int j) { return h[i] & l[j] & g[ i/3*3 + j/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 k = sum[ find(i,j) ]; if(ans > k) ans = k , x = i, y = j; } if(ans == 10) return true; int num = find(x,y); for(int i = 0 ; i < 9 ; i++) { int p = (1<<i); if( num & p ) { h[x] -= p; l[y] -= p; g[ x/3*3 + y/3 ] -= p; a[x][y] = i+1; if(dfs()) return true; h[x] += p; l[y] += p; g[ x/3*3 + y/3 ] += p; a[x][y] = 0; } } return false; } int main() { for(int i = 0 ; i < 512 ; i++) { int j = i; while(j) { j =j - (j&-j); sum[i]++; } } while(cin >> s && s != "end") { memset(a,0,sizeof a); init(); for(int i = 0 ; i < 81 ; i++) { int x; if(s[i] == '.') x = 0; else x = s[i] - 48; a[i/9][i%9] = x; } 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); h[i] -= num; l[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; } }
信息
- ID
- 77
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 272
- 已通过
- 101
- 上传者