比赛 |
EYOI常规赛8th |
评测结果 |
A |
题目名称 |
数独2 |
最终得分 |
100 |
用户昵称 |
ムラサメ |
运行时间 |
0.689 s |
代码语言 |
C++ |
内存使用 |
5.89 MiB |
提交时间 |
2023-03-10 15:20:00 |
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=9;
int ones[1<<N],map[1<<N];
int row[N],col[N],cell[3][3];
char str[100];
inline int lowbit(int x){
return x&-x;
}
void init(){
for(int i=0;i<N;i++) row[i]=col[i]=(1<<N)-1;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cell[i][j]=(1<<N)-1;
}
inline int get(int x,int y){
return row[x]&col[y]&cell[x/3][y/3];
}
bool dfs(int cnt){
if(!cnt)return true;
int minv=10;
int x,y;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(str[i*9+j]=='.'){
int t=ones[get(i,j)];
if(t<minv){
minv=t;
x=i;
y=j;
}
}
}
}
for(int i=get(x,y);i;i-=lowbit(i)){
int t=map[lowbit(i)];
row[x]-=1<<t;
col[y]-=1<<t;
cell[x/3][y/3]-=1<<t;
str[x*9+y]='1'+ t;
if(dfs(cnt-1)) return true;
str[x*9+y]='.';
cell[x/3][y/3]+=1<<t;
col[y]+=1<<t;
row[x]+=1<<t;
}
return false;
}
int main(){
freopen("sudoku2.in","r",stdin);
freopen("sudoku2.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(int i=0;i<N;i++)map[1<<i]=i;
for(int i=0;i<1<<N;i++){
int s=0;
for(int j=i;j;j-=lowbit(j))s++;
ones[i]=s;
}
while(cin>>str,str[0]!='e'){
init();
int cnt=0;
for(int i=0,k=0;i<N;i++)
for(int j=0;j<N;j++,k++)
if(str[k]!='.'){
int t=str[k]-'1';
row[i]-=1<<t;
col[j]-=1<<t;
cell[i/3][j/3]-=1<<t;
}
else cnt++;
dfs(cnt);
cout<<str<<endl;
}
return 0;
}