记录编号 279462 评测结果 AAAAAAAAAA
题目名称 [USACO 1.5.4] 跳棋的挑战 最终得分 100
用户昵称 Gravatar5458 是否通过 通过
代码语言 C++ 运行时间 1.578 s
提交时间 2016-07-09 11:17:53 内存使用 0.31 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>//呵呵我tm以后永远不再忘加头文件了
#include <algorithm>//包括用不到的头文件我也加
#include <vector>
using namespace std;
int n,cnt=0;//我把count简化成了cnt不知道cnt本来的含义是否如此
int upperlim=1;
vector<int> v;
int repr(int x){//将位置转换为结果
	int c=0;
	while(x){
		x=x>>1;
		c++;
	}
	return c;
}
void dfs(int row,int ld,int rd){
	if(row==upperlim){
		cnt++;
		if(cnt<4){
			for(int i=0;i<v.size();i++)
				cout<<v[i]<<' ';
			cout<<endl;
		}
	}
	else{
		int pos,p;
		pos=upperlim&(~(row|ld|rd));//所有不能放的位置集合起来
		while(pos!=0){
			p=pos&(-pos);//取右边最低位 如 011000时取第一个1 表示该位置可以放
			pos-=p;//删去这个位置
			v.push_back(repr(p));
			dfs(row+p,(ld+p)<<1,(rd+p)>>1);//状态更新
			v.pop_back();
		}
	}
}
int main(){
	freopen("checker.in","r",stdin);
	freopen("checker.out","w",stdout);
	cin>>n;
	upperlim=(upperlim<<n)-1;
	dfs(0,0,0);
	cout<<cnt;
	return 0;
}