丧心病狂卡爆搜

好好的位运算都被卡,崩溃了

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const int Get_Int() {
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
const int Match[15][15]= {
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
};
int cnt=0,M[305],Map[15][15],RowHash[15],LineHash[15],PalaceHash[15],Number[15],Empty[15],ans=-1,bj=1;
int Lowbit(int x) { //低位技术:返回最右边的第一个1对应的值
return x&(-x); //-x按位取反再加一
}
void Dfs(int x,int y) {
int Nextx=x,Nexty=y;
if(x==10&&y==1) {
for(int i=1; i<=9; i++) {
for(int j=1; j<=9; j++)
printf("%d",Map[i][j]);
}
putchar('\n');
bj=0;
}
if(bj==0)return;
if(y==9) {
Nextx++;
Nexty=1;
} else Nexty++;
if(Map[Number[x]][y]!=-1) { //已经有值
Dfs(Nextx,Nexty);
return;
}
int State=(RowHash[Number[x]]|LineHash[y])|PalaceHash[Match[Number[x]][y]]; //已经填过的数字
State=0x1ff&(~State); //0x1ff=511
while(State) { //填满所有可填方案
int tmp=Lowbit(State); //找到可填的最小的数字
State-=tmp;
RowHash[Number[x]]^=tmp;
LineHash[y]^=tmp;
PalaceHash[Match[Number[x]][y]]^=tmp;
Map[Number[x]][y]=M[tmp];
Dfs(Nextx,Nexty);
RowHash[Number[x]]^=tmp;
LineHash[y]^=tmp;
PalaceHash[Match[Number[x]][y]]^=tmp;
}
Map[Number[x]][y]=-1;
}
int n;
int main() {
M[1]=1;
M[2]=2;
M[4]=3;
M[8]=4;
M[16]=5;
M[32]=6;
M[64]=7;
M[128]=8;
M[256]=9;
for(int i=1; i<=9; i++)Number[i]=i;
scanf("%d",&n);
getchar();
for(int i=1; i<=n; i++) {
bj=1;
memset(RowHash,0,sizeof(RowHash));
memset(LineHash,0,sizeof(RowHash));
memset(PalaceHash,0,sizeof(RowHash));
memset(Map,-1,sizeof(Map));
for(int i=1; i<=9; i++) {
for(int j=1; j<=9; j++) {
char c;
scanf("%c",&c);
int x=c-'0';
if(c!='0') {
Map[i][j]=x;
int tmp=1<<Map[i][j]-1; //位运算优化
RowHash[i]^=tmp;
LineHash[j]^=tmp;
PalaceHash[Match[i][j]]^=tmp;
} else {
Map[i][j]=-1;
Empty[i]++;
}
}
}
getchar();
for(int i=1; i<9; i++)
for(int j=i+1; j<=9; j++) //冒泡排序:按照空白部分少的行进行排序
if(Empty[i]>Empty[j]) {
swap(Empty[i],Empty[j]);
swap(Number[i],Number[j]);
}
Dfs(1,1);
}
return 0;
}

0 条评论

目前还没有评论...

信息

ID
1345
难度
8
分类
搜索 | 搜索与剪枝搜索 | DLX 点击显示
标签
递交数
1274
已通过
186
通过率
15%
被复制
6
上传者