| 记录编号 |
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;
}