LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 781|回复: 1

求助c++问题!

[复制链接]
发表于 2002-12-2 18:10:24 | 显示全部楼层 |阅读模式
//8皇后问题,在一个国际象棋棋盘上(估计是8*8)要摆上8个皇后,
//限制条件是,在每个已摆放的位置的同行,同列,斜线方向不能有皇后!
//我得问题是:执行到queen(5)就不循环了!大家可以复制,编译一下!
//多谢!,复制即可用!格式已经可用!

#include<iostream>

using namespace std;
int A[8][8];
int i,j,a,b,c,n=0;//前示定义

int just(int p,int q) {//判断当前位置可否方放皇后
        int temp1=p;int temp2=q; //temp1,temp2用于保存传递过来的的行和列的值
//__________________________________
                 for (;p>=0;p--){
                           if(A[p][q]==1) {a=0;break;}
                           }
                    if(p==-1){a=1;}
//__________________________________以上为判断当前位置的同列有无皇后,a=1代表无皇后
                    p=temp1; q=temp2;
                    for ( ;p>=0&&q>=0;p--,q--) {
                            if(A[p][q]==1) {b=0;break;}
                            }

                    if(p==-1||q==-1) {b=1;}
//----------------------以上为判断左斜上方有无皇后,b=1代表无皇后

                    p=temp1;q=temp2;
                    for(;p>=0&&q<8;p--,q++) {
                            if(A[p][q]==1) {c=0;break;}
                            }
                    if(p==-1||q==8) {c=1;}
                   cout<<a<<b<<c<<endl;
//_____________________________________以上为判断右斜上方有无皇后,c=1代表无皇后                 
                    if (a&&b&&c) {return 1;}//当abc同时为1时,说明当前位置可以放,just()值为1;
                    else{return 0;}//否这返回0,just()值为0;
                           }
void printf() {n++;//printf()用于输出数组,以为我设置为,每找到一个合理排放就输出一次,所以n
                for(int m=0;m<8;m++) {//代表一共有多少次合理排放
                        for(int l=0;l<8;l++){
                                if(l%8==0){cout<<"\n";}
                                cout<<A[m][l];}
                                }
                       
}

void queen(int k) {//递归函数,queen(k)表示在第k行一个合理的位置,放第k个皇后,
        if (k==7) {
                for (j=0;j<8;j++) {
                     if (just(k,j)) {
                             A[k][j]==1;
                             printf();//当递归到最后一行,并且找到合理位置,输出这个排放
                             for(int d=0;d<8;d++)//清空当前第k行,执行for,在第7行找下一个合理函数
                                     A[k][d]=0;//(其实我得本意是想在执行for找第j+1个位置的时候,清空A[7][j]的
                             }                           //可是确定不了这个位置,但知道一定在这个行里,所以全给清了。
                      }
        }
       
        else{//不是最后一行的话,在当前行找可放第k个皇后的位置,找到则执行queen(k+1),
                //找不到则执行for循环,当当前行没有合理的位置的时候,返回到上一次的queen(即上一行中)  
                //执行上一行没完成的for循环,找的A[K][j+1]看看合适不?同时要把A[k][j]清零,防止影响本次判断(不过大家看我得清零对不对)
                for (j=0;j<8;j++){
                       if(just(k,j)) {//判断这个位置合理不
                        A[k][j]=1;
                        queen (k+1);//如果合理则在这个位置上放上1,表示第k个皇后已经有位置了,执行queen(k+1)
                            }
                       for(int d=0;d<8;d++){ A[k][d]=0;}//呵呵。这次清零还是清的全部行,笨了,因为还是确定不了这个行的哪个位置已经有皇后
                      }
                }
return;}

int main() {
        for(int i=0;i<8;i++) {//创建一个8*8数组,全部赋值为零
                for (int j=0;j<8;j++) {
                        A[j]=0;}
                }
       
      
        queen(0);//从数组的第一行开始找的一个皇后的位置,自然就开始了递归!
         cout<<endl<<"there are "<<n<<"  times"<<endl;//找到多少个合理排放
         cout<<"=====complete=====";
}
发表于 2002-12-3 07:43:57 | 显示全部楼层
我这几天没时间,要安装LFS,要不然肯定能给你好好看看。请别的兄弟帮帮忙吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表