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

checker.final.cpp

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

开关行号, 全选(Ctrl+C复制) | 一键复制:HTML, BBCode(Discuz!) , 源代码 | 查看:裸代码, 全屏
背景
主题: 字体:
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 }
打分:

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


发表评论

注册登录后再发表评论