比这篇新的文章:
main.cpp
比这篇旧的文章: checker.combine.cpp
作者: xpycc, 点击227次, 评论(0), 收藏者(0)
打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: checker.combine.cpp
checker.bitset.cpp
语言: C++, 标签: 无 2008/08/22发布 3个月前更新作者: xpycc, 点击227次, 评论(0), 收藏者(0)
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 }
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条:( 我也来说两句)
代码