比这篇新的文章: main.cpp
比这篇旧的文章: checker.combine.cpp

checker.bitset.cpp

语言: C++, 标签: 无  2008/08/22发布 3个月前更新
作者: xpycc, 点击227次, 评论(0), 收藏者(0)

开关行号, 全选(Ctrl+C复制) | 一键复制:HTML, BBCode(Discuz!) , 源代码 | 查看:裸代码, 全屏
背景
主题: 字体:
C++语言: checker.bitset.cpp
01 /*
02 ID:xpycc1
03 PROG:checker
04 LANG:C++
05 */
06
07 #include<fstream>
08 #define maxn 13
09 using namespace std;
10 ifstream fin("checker.in");
11 ofstream fout("checker.out");
12
13 int n,op,opd,sum=0,res[maxn];
14
15 void find(){
16     int i;
17     for(i=0;i<n-1;++i)
18         fout<<res[i]<<" ";
19     fout<<res[n-1]<<endl;
20 }
21
22 void solve(int x,int k1,int k2,int y){
23     int pos=~(x|k1|k2),p,i;                 //only for pos 1:can 0:can't
24     if(x==op){                              //no 0,already
25         ++sum;
26         find();
27         return;
28     }
29     for(i=p=1;p<op;p<<=1,++i)       //要记录位置,所以老老实实一位一位移吧
30         if(pos&p){
31             if(sum<3) res[y]=i;
32             solve(x+p,(k1+p)<<1,(k2+p)>>1,y+1);
33             if(sum==3) return;
34         }
35 }
36
37 void solve(int x,int k1,int k2){//重载函数,辛苦下编译器,懒得再命名一个,况且不会增加运行时间
38     int pos=op&~(x|k1|k2),p;                //only for pos 1:can 0:can't
39     if(x==op){                              //no 0,already
40         ++sum;
41         return;
42     }
43     while(pos){   //小技巧:负数用补码存储,所以可直接得到最右边的1
44         p=pos&-pos; pos-=p;
45         solve(x+p,(k1+p)<<1,(k2+p)>>1);
46     }
47 }
48
49 int main(){
50     int i;
51     fin>>n;
52     op=(1<<n)-1;
53     opd=(1<<(n>>1))-1;
54
55     solve(0,0,0,0);                        //0:OK 1:used
56
57     sum=0;
58     for(i=1;i<opd;i<<=1)                   //half
59         solve(i,i<<1,i>>1);
60     sum<<=1;
61     if(n&1) solve(i,i<<1,i>>1);
62
63     fout<<sum<<endl;
64     return 0;
65 }
打分:

所有评论,共0条:( 我也来说两句)


发表评论

注册登录后再发表评论