信息
- ID
- 77
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 275
- 已通过
- 104
- 上传者
#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;
}
}