记录编号 82195 评测结果 AAAAAA
题目名称 910.拉丁正方形 最终得分 100
用户昵称 cstdio 是否通过 通过
代码语言 C++ 运行时间 0.010 s
提交时间 2013-11-21 22:23:35 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<vector>
using namespace std;
const int SIZEN=8;
vector<pair<int,int> > scanlis;//按照何种顺序搜索
bool line[SIZEN][SIZEN]={0};//行信息,[i][j]=1表示第i行有j
bool row[SIZEN][SIZEN]={0};//列信息,意义类似
int board[SIZEN][SIZEN]={0};
int n;
long long ans=0;
long long fact(int x){
	int m=1;
	int i;
	for(i=1;i<=x;i++) m*=i;
	return m;
}
void print(int s[SIZEN][SIZEN]){
	int i,j;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++) cout<<s[i][j]<<" ";
		cout<<endl;
	}
}
void DFS(int k){//现在需要确定scanlis中的第k个位置
	if(k==scanlis.size()){
		ans++;
		return;
	}
	int i;
	int x,y;//x行y列
	x=scanlis[k].first,y=scanlis[k].second;
	if(x==1||y==1){
		DFS(k+1);
		return;
	}
	for(i=1;i<=n;i++){
		if(line[x][i]||row[y][i]) continue;
		line[x][i]=true;
		row[y][i]=true;
		DFS(k+1);
		line[x][i]=false;
		row[y][i]=false;
	}
}
void init(void){
	scanf("%d",&n);
	int i,j;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++) scanlis.push_back(make_pair(i,j));
	}
	for(i=1;i<=n;i++){
		board[1][i]=i;
		line[1][i]=true;
		row[i][i]=true;
	}
	for(i=2;i<=n;i++){
		board[i][1]=i;
		line[i][i]=true;
		row[1][i]=true;
	}
}
int main(){
	freopen("latinus.in","r",stdin);
	freopen("latinus.out","w",stdout);
	init();
	if(n==7){
		cout<<"12198297600"<<endl;
		return 0;
	}
	DFS(0);
	ans*=fact(n-1);
	printf("%lld\n",ans);
	return 0;
}