n皇后问题的递归解法

#include
#include
#include
#include
using namespace std;
int N;
int a[101];//用来存放放好的皇后的位置,最左上角是(0,0)
int cnt=1;
void Nqueen(int k) {//在0~k-1行已经摆好的情况下,摆放k行及其后的皇后
    if(k==N){
        cout<<"No. "<for(int i=0; icout<1<<" ";
        cout<for(int i=0; i//逐个尝试第k个皇后的位置
        int j;
        for(j=0; j//和已经摆好的k个皇后的位置比较,看是否冲突
            if(a[j]==i||abs(a[j]-i)==abs(k-j))
                break;//冲突,则下一个位置
        }
        if(j==k){//当前选的位置i不冲突
            a[k]=i;//将第k个皇后放在位置i
            Nqueen(k+1);
        }
    }//for(int i=0;i
    return ;
}
int main(){
    scanf("%d",&N);
    Nqueen(0);//从第0行开始摆放皇后
    return 0;
}

执行结果:
n皇后问题的递归解法_第1张图片
相关题目:
八皇后问题
总Time Limit: 10000ms Memory Limit: 65536kB
Description
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
Input
无输入。
Output
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
Sample Input
Sample Output
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
No. 4
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
No. 5
0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
No. 6
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 7
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 8
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
No. 9
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
…以下省略
Hint
此题可使用函数递归调用的方法求解。
my code:(其实就是修改了下输入输出)

#include
#include
#include
#include
using namespace std;
int N;
int a[101];
int b[101][101];//用来存放放好的皇后的位置,最左上角是(0,0)
int cnt=1;
void Nqueen(int k) {//在0~k-1列已经摆好的情况下,摆放k列及其后的皇后
    if(k==N){
        //freopen("C:\\Users\\saS\\Desktop\\666.txt","a",stdout);
        cout<<"No. "<for(int i=0; ifor(int j=0;jif(j==a[i]){
                            b[j][i]=1;
                        }
                        else{
                            b[j][i]=0;
                        }
                    }
            }
            for(int i=0;ifor(int j=0;jif(j!=N-1)
                    cout<" ";
                    else
                    cout<// fclose(stdout);
        }

    for(int i=0; i//逐个尝试第k个皇后的位置
        int j;
        for(j=0; j//和已经摆好的k个皇后的位置比较,看是否冲突
            if(a[j]==i||abs(a[j]-i)==abs(k-j))
                break;//冲突,则下一个位置
        }
        if(j==k){//当前选的位置i不冲突
            a[k]=i;//将第k个皇后放在位置i
            Nqueen(k+1);
        }
    }//for(int i=0;i
    return ;
}
int main(){
    N=8;
    Nqueen(0);//从第0行开始摆放皇后
    return 0;
}

n皇后问题的递归解法_第2张图片
八皇后
总Time Limit: 1000ms Memory Limit: 65536kB
Description
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
Input
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
Output
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
Sample Input
2
1
92
Sample Output
15863724
84136275

#include
#include
#include
#include
#include
using namespace std;
int N;
int a[101];//用来存放放好的皇后的位置,最左上角是(0,0)
int cnt=0;
int b[101]={0};
void Nqueen(int k) {//在0~k-1行已经摆好的情况下,摆放k行及其后的皇后
    if(k==N){
        for(int i=0; i10+a[i]+1;
            cnt++;

    }
    for(int i=0; i//逐个尝试第k个皇后的位置
        int j;
        for(j=0; j//和已经摆好的k个皇后的位置比较,看是否冲突
            if(a[j]==i||abs(a[j]-i)==abs(k-j))
                break;//冲突,则下一个位置
        }
        if(j==k){//当前选的位置i不冲突
            a[k]=i;//将第k个皇后放在位置i
            Nqueen(k+1);
        }
    }//for(int i=0;i
    return ;
}
int main(){
    N=8;
    int n;
    scanf("%d",&n);
    Nqueen(0);//从第0行开始摆放皇后
    int test;
    sort(b,b+101);
    int k;
    for(int i=0;i<101;i++)
    {
        if(b[i]!=0)
        {
            k=i;
            break;
        }
    }
    for(int i=0;iscanf("%d",&test);
        cout<1]<return 0;
}

n皇后问题的递归解法_第3张图片

你可能感兴趣的:(c++,poj)