checker.cpp

来自「dd牛的usaco源代码!对学习算法」· C++ 代码 · 共 93 行

CPP
93
字号
/*
ID: dd.ener1
PROG: checker
LANG: C++
*/
#include <cstdio>
#include <cstring>
using namespace std;

long N;
long nums[15];
long answer=0;
bool jiao1[30],jiao2[30];
long next[15];
long list_beg=0;

void input(){
	freopen("checker.in","r",stdin);
	scanf("%d",&N);
	fclose(stdin);
	memset(jiao1,false,sizeof(jiao1));
	memset(jiao2,false,sizeof(jiao2));
	memset(next,-1,sizeof(next));
	freopen("checker.out","w",stdout);
	for(long i=0;i<N;++i)next[i]=i+1;
	next[N-1]=-1;
}
void output(){
	if(++answer>3)return;
	printf("%d",nums[0]);
	for(long i=1;i<N;++i)printf(" %d",nums[i]);
	putchar('\n');
}
inline long getjiao1(const long n,const long i){
	if(i<=n)return n-i;
	return i-n+N;
}
inline long getjiao2(const long n,const long i){
	return getjiao1(n,N-i);
}
inline bool canput(const long n,const long i){
	if(jiao1[getjiao1(n,i)])return false;
	if(jiao2[getjiao2(n,i)])return false;
	return true;
}
inline void put(const long n,const long i){
	jiao1[getjiao1(n,i)]=true;
	jiao2[getjiao2(n,i)]=true;
	nums[n]=i+1;
}
inline void unput(const long n,const long i){
	jiao1[getjiao1(n,i)]=false;
	jiao2[getjiao2(n,i)]=false;
}
void search(long n){
	if(n==N-1){
		if(canput(n,list_beg)){
			put(n,list_beg);
			output();
			unput(n,list_beg);
		}
		return;
	}
	long i=list_beg;
	long j=next[i];
	if(canput(n,i)){
		list_beg=j;
		put(n,i);
		search(n+1);
		unput(n,i);
		list_beg=i;
	}
	while(j!=-1){
		if(canput(n,j)){
			next[i]=next[j];
			put(n,j);
			search(n+1);
			unput(n,j);
			next[i]=j;
		}
		i=j;
		j=next[j];
	}
}
void outans(){
	printf("%d\n",answer);
}
int main(){
	input();
	search(0);
	outans();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?