首页 > 代码库 > 初学者看待八皇后问题

初学者看待八皇后问题

                                                      (原创,未经允许不得转载) 经典的八皇后问题  

 题目:

八皇后问题就是在8*8的棋盘上放置8个皇后,使其任意两个不在同一行、同一列、同一斜线上。

 解题思路:

去掉行这个因素,然后去考虑是否在同一列或同一斜线上。每个摆放成功的棋子在(i,x[i]),然后设置当前行,然后在该行从第一列一直试探到第8列,看是否符合条件,同时只有当当前行之前的棋子都符合条件,才能继续下一行,直到第八行,进行输出。

 代码:

#include "stdafx.h"
#include "iostream"  
using namespace std;  命名空间

int n=8,count=0;
int x[8];      数组的个数不能用字母n代替,应该用数字,要用字母的话得用#define 定义
void print(){        输出八皇后函数
    for(int i=0;i<n;i++){      
        for(int j=0;j<n;j++){     嵌套循环
            if(j==x[i])      当该列是棋子所在的第x[i]列时输出1
                cout<<"1"<<" ";
            else
                cout<<"0"<<" ";
            }
            cout<<endl;
        }
        cout<<"---------"<<endl;
    }
    void eight_queen(int r){
        if(r==n){
            print();
         count++;
         return;     return从当前方法即eight_queen中退出返回到该调用方法即主函数的语句处,继续执行。如果不返回值时,方法类型必须为void;方法前有返回类型,则必须返回值,但如果是void,即使写了值也不能返回数值。
        }
        for(int i=0;i<n;i++){
            x[r]=i;
            int ok=1;
            for(int j=0;j<r;j++){
                if(r-x[r]==j-x[j]||r+x[r]==j+x[j]||x[j]==x[r])
                {
                    ok=0;                  if不加花括号只能管到一行,不符合条件,ok覆盖上面的值,变为0.
                    break;
                }
            }
             if(ok)
                 eight_queen(r+1);
        }
     
    }

int main(int argc, char* argv[])
{
   eight_queen(0);
   cout<<"count="<<count<<endl;
    return 0;
}

 

初学者看待八皇后问题