比这篇新的文章:
checker.combine.cpp
比这篇旧的文章: rect1.pas
作者: xpycc, 点击218次, 评论(0), 收藏者(0)
打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: rect1.pas
checker.final.cpp
语言: C++, 标签: 无 2008/08/22发布 3个月前更新 更新记录作者: xpycc, 点击218次, 评论(0), 收藏者(0)
C++语言: checker.final.cpp
001 /*
002 ID:xpycc1
003 PROG:checker
004 LANG:C++
005 */
006
007 #include<fstream>
008 #define maxn 13
009 using namespace std;
010 ifstream fin("checker.in");
011 ofstream fout("checker.out");
012
013 int n,g,d;
014 long lr;
015 bool b[maxn],b1[maxn*2-1],b2[maxn*2-1],*x=b-1,*k1=b1-2,*k2=b2+maxn-1;//哈哈,像Pascal一样用数组
016 int res[maxn];
017
018 void find(){
019 int i;
020 for(i=0;i<n-1;++i)
021 fout<<res[i]<<" ";
022 fout<<res[n-1]<<endl;
023 }
024
025 void solve1(int y){
026 int i;
027 if(y==n+1){
028 ++lr;
029 if(lr<=3) find();
030 return;
031 }
032 for(i=1;i<=n;++i)
033 if(x[i]&&k1[i+y]&&k2[i-y]){
034 x[i]=k1[i+y]=k2[i-y]=false;
035 if(lr<3) res[y-1]=i;
036 solve1(y+1);
037 if(lr==3)return;
038 x[i]=k1[i+y]=k2[i-y]=true;
039 }
040 }
041
042 void solve(int y){
043 int i;
044 if(y==n+1){
045 ++lr;
046 return;
047 }
048 for(i=1;i<=n;++i)
049 if(x[i]&&k1[i+y]&&k2[i-y]){
050 x[i]=k1[i+y]=k2[i-y]=false;
051 solve(y+1);
052 x[i]=k1[i+y]=k2[i-y]=true;
053 }
054 }
055
056 void solve0(int y){
057 int i;
058 if(y==n+1){
059 ++lr;
060 return;
061 }
062 if(y==d || y==g){
063 solve0(y+1);
064 return;
065 }
066 for(i=1;i<=n;++i)
067 if(x[i]&&k1[i+y]&&k2[i-y]){
068 x[i]=k1[i+y]=k2[i-y]=false;
069 solve0(y+1);
070 x[i]=k1[i+y]=k2[i-y]=true;
071 }
072 }
073
074 int main(){
075 int i,j;
076 fin>>n;
077 memset(b,true,sizeof(b));
078 memset(b1,true,sizeof(b1));
079 memset(b2,true,sizeof(b2));
080 lr=0;
081 solve1(1);
082 memset(b,true,sizeof(b));
083 memset(b1,true,sizeof(b1));
084 memset(b2,true,sizeof(b2));
085 lr=0;
086 if(n&1){
087 d=(n>>1)+1;
088 x[d]=false;
089 for(j=1;j<d;++j){ //j行,d列
090 k1[d+j]=false; k2[d-j]=false; g=j;
091 for(i=1;i<j;++i){ //d行,i列
092 x[i]=false; k1[i+d]=false; k2[i-d]=false;
093 solve0(1);
094 x[i]=true; k1[i+d]=true; k2[i-d]=true;
095 }
096 k1[d+j]=true; k2[d-j]=true;
097 }
098 lr<<=3; //lr*8
099 k1[d<<1]=false; k2[0]=false; g=d;
100 solve0(1); //别忘了那个特殊情况:d行d列的
101 }else{
102 for(i=1;i<=(n>>1);++i){
103 x[i]=false; k1[i+1]=false; k2[i-1]=false;
104 solve(2);
105 x[i]=true; k1[i+1]=true; k2[i-1]=true;
106 }
107 lr<<=1;
108 }
109 fout<<lr<<endl;
110 return 0;
111 }
002 ID:xpycc1
003 PROG:checker
004 LANG:C++
005 */
006
007 #include<fstream>
008 #define maxn 13
009 using namespace std;
010 ifstream fin("checker.in");
011 ofstream fout("checker.out");
012
013 int n,g,d;
014 long lr;
015 bool b[maxn],b1[maxn*2-1],b2[maxn*2-1],*x=b-1,*k1=b1-2,*k2=b2+maxn-1;//哈哈,像Pascal一样用数组
016 int res[maxn];
017
018 void find(){
019 int i;
020 for(i=0;i<n-1;++i)
021 fout<<res[i]<<" ";
022 fout<<res[n-1]<<endl;
023 }
024
025 void solve1(int y){
026 int i;
027 if(y==n+1){
028 ++lr;
029 if(lr<=3) find();
030 return;
031 }
032 for(i=1;i<=n;++i)
033 if(x[i]&&k1[i+y]&&k2[i-y]){
034 x[i]=k1[i+y]=k2[i-y]=false;
035 if(lr<3) res[y-1]=i;
036 solve1(y+1);
037 if(lr==3)return;
038 x[i]=k1[i+y]=k2[i-y]=true;
039 }
040 }
041
042 void solve(int y){
043 int i;
044 if(y==n+1){
045 ++lr;
046 return;
047 }
048 for(i=1;i<=n;++i)
049 if(x[i]&&k1[i+y]&&k2[i-y]){
050 x[i]=k1[i+y]=k2[i-y]=false;
051 solve(y+1);
052 x[i]=k1[i+y]=k2[i-y]=true;
053 }
054 }
055
056 void solve0(int y){
057 int i;
058 if(y==n+1){
059 ++lr;
060 return;
061 }
062 if(y==d || y==g){
063 solve0(y+1);
064 return;
065 }
066 for(i=1;i<=n;++i)
067 if(x[i]&&k1[i+y]&&k2[i-y]){
068 x[i]=k1[i+y]=k2[i-y]=false;
069 solve0(y+1);
070 x[i]=k1[i+y]=k2[i-y]=true;
071 }
072 }
073
074 int main(){
075 int i,j;
076 fin>>n;
077 memset(b,true,sizeof(b));
078 memset(b1,true,sizeof(b1));
079 memset(b2,true,sizeof(b2));
080 lr=0;
081 solve1(1);
082 memset(b,true,sizeof(b));
083 memset(b1,true,sizeof(b1));
084 memset(b2,true,sizeof(b2));
085 lr=0;
086 if(n&1){
087 d=(n>>1)+1;
088 x[d]=false;
089 for(j=1;j<d;++j){ //j行,d列
090 k1[d+j]=false; k2[d-j]=false; g=j;
091 for(i=1;i<j;++i){ //d行,i列
092 x[i]=false; k1[i+d]=false; k2[i-d]=false;
093 solve0(1);
094 x[i]=true; k1[i+d]=true; k2[i-d]=true;
095 }
096 k1[d+j]=true; k2[d-j]=true;
097 }
098 lr<<=3; //lr*8
099 k1[d<<1]=false; k2[0]=false; g=d;
100 solve0(1); //别忘了那个特殊情况:d行d列的
101 }else{
102 for(i=1;i<=(n>>1);++i){
103 x[i]=false; k1[i+1]=false; k2[i-1]=false;
104 solve(2);
105 x[i]=true; k1[i+1]=true; k2[i-1]=true;
106 }
107 lr<<=1;
108 }
109 fout<<lr<<endl;
110 return 0;
111 }
所有评论,共0条:( 我也来说两句)
代码