比赛 |
防止浮躁的小练习v0.9 |
评测结果 |
RRRRRRRRRRRRRRRRRRRR |
题目名称 |
殉国 |
最终得分 |
0 |
用户昵称 |
zhjian |
运行时间 |
0.054 s |
代码语言 |
C++ |
内存使用 |
0.29 MiB |
提交时间 |
2016-11-07 14:01:04 |
显示代码纯文本
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#define N 205
#define M 25
#define inf 0x3f3f3f3f
#define LL long long
using namespace std;
int nn,map[N];
LL sum=0;
struct DLX{
int U[N],D[N],L[N],R[N],row[N],col[N];
int n,m,sum;
int size;
void init(int C){
sum=0;
n=C;
m=2*C;
size=C;
for(int i=0;i<=m;i++){
U[i]=i;
D[i]=i;
L[i]=i-1;
R[i]=i+1;
col[i]=i;
row[i]=0;
}
L[0]=m;
R[m]=0;
}
void push(int r,int c){
size++;
U[size]=U[c];
D[size]=c;
D[U[size]]=size;
U[c]=size;
R[size]=r;
L[size]=L[r];
R[L[size]]=size;
L[r]=size;
row[size]=r;
col[size]=c;
}
void add(int r,int c1,int c2){
push(r,c1);
push(r,c2+n);
}
void del(int c){
R[L[c]]=R[c];
L[R[c]]=L[c];
for(int i=D[c];i!=c;i=D[i]){
for(int j=R[i];j!=i;j=R[j]){
D[U[j]]=D[j];
U[D[j]]=U[j];
}
}
}
void reback(int c){
for(int i=U[c];i!=c;i=U[i]){
for(int j=L[i];j!=i;j=L[j]){
D[U[j]]=j;
U[D[j]]=j;
}
}
R[L[c]]=c;
L[R[c]]=c;
}
void dancing(){
if(R[0]==0){
sum++;
return ;
}
int c=R[0];
if(D[c]==c)
return ;
del(c);
for(int i=D[c];i!=c;i=D[i]){
for(int j=R[i];j!=i;j=R[j]){
del(col[j]);
}
dancing();
for(int j=L[i];j!=i;j=L[j])
reback(col[j]);
}
}
}dlx;
int main(){
// freopen("chess_2016.in","r",stdin);
// freopen("chess_2016.out","w",stdout);
cin>>nn;
int num=0;
for(int i=1;i<=nn;i++){
for(int j=1;j<=nn;j++){
int c;
cin>>c;
if(c==1)
map[i]=j;
}
}
dlx.init(nn);
int l=1;
for(int i=1;i<=nn;i++){
bool f=false;
for(int j=1;j<=nn;j++){
if(j!=map[i]){
if(!f)
dlx.add(l++,j,i);
else
dlx.add(l++,j,i);
}
if(j==map[i])
f=true;
}
}
dlx.dancing();
cout<<dlx.sum;
// fclose(stdin);
// fclose(stdout);
return 0;
}