比赛 防止浮躁的小练习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;
}