记录编号 217422 评测结果 AAAAAAAAAA
题目名称 [USACO 1.5.4] 跳棋的挑战 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2016-01-03 16:16:10 内存使用 0.29 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
using namespace std;
int sol[16]={0,0,0,0,0,0,4,40,92,352,724,2680,14200,73712,365596};
int ans;
int row[16];//row[i]:第i行的跳棋在哪一列 
bool lined[16];//lined[i]:第i列是否有跳棋 
int n;
void dfs(int r){
	if(ans==3)return;
	if(r==n+1){
		ans++;
		for(int i = 1;i<n;++i){
			printf("%d ",row[i]);
		}
		printf("%d\n",row[n]);
	}else{
		for(int i = 1;i<=n;++i){
			if(!lined[i]){
				bool flag=true;
				for(int j = 1;j<r;++j){
					if(((r+i)==(j+row[j]))||r-i==j-row[j]){
						flag=false;
						break;
					}
				}
				if(flag){
					lined[i] = true;
					row[r] = i;
					dfs(r+1);
					lined[i] = false;
				}
			}
		}
	}
}
int main(){
	freopen("checker.in","r",stdin);
	freopen("checker.out","w",stdout);
	scanf("%d",&n);
	dfs(1);
	printf("%d",sol[n]);
	fclose(stdin);fclose(stdout);
	return 0;
}