记录编号 |
279462 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO 1.5.4] 跳棋的挑战 |
最终得分 |
100 |
用户昵称 |
5458 |
是否通过 |
通过 |
代码语言 |
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;
}