n皇后问题

/*n皇后问题*/
#include <iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxn 1000
int n,tot,col[maxn],vis[3][maxn];
void search(int cur)
{
    int i,j;
    if(cur==n)
    {
        tot++;
        printf("----解%d:----
",tot);
        for(i=0; i<n; i++)
        {
            printf("x = %d y = %d
",i,col[i]);
        }
        printf("
");
    }//递归边界。只要走到这所以皇后必然不冲突
    else for(i=0; i<n; i++)
        {
            //优化前:
            /*int ok=1;
            col[cur]=i;//尝试把第cur行的皇后放在第i列
            for(j=0; j<cur; j++)//检查是否和前面的皇后冲突
                if(col[cur]==col[j]||cur-col[cur]==j-col[j]||cur+col[cur]==j+col[j])
                {
                    ok=0;
                    break;
                }
            if(ok)
                search(cur+1);//如果合法,则继续递归*/
            //优化后:(回溯法)
            if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
            //利用二位数组直接判断
            {
                col[cur]=i;//如果不打印解,整个col数组都可以省略
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;//修改全局变量
                search(cur+1);
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;//切记一定要改回来
            }

        }
}
int main()
{
    while(scanf("%d",&n)==1)
    {
        tot=0;
        memset(vis,0,sizeof(vis));
        search(0);
        printf("共有解 %d 个
",tot);
    }
    return 0;
}
/*
4
----解1:----
x = 0 y = 1
x = 1 y = 3
x = 2 y = 0
x = 3 y = 2

----解2:----
x = 0 y = 2
x = 1 y = 0
x = 2 y = 3
x = 3 y = 1

共有解 2 个
8
 ---省略----
     .
     .
     .
----解64:----
x = 0 y = 4
x = 1 y = 7
x = 2 y = 3
x = 3 y = 0
x = 4 y = 6
x = 5 y = 1
x = 6 y = 5
x = 7 y = 2

----解65:----
x = 0 y = 5
x = 1 y = 0
x = 2 y = 4
x = 3 y = 1
x = 4 y = 7
x = 5 y = 2
x = 6 y = 6
x = 7 y = 3

----解66:----
x = 0 y = 5
x = 1 y = 1
x = 2 y = 6
x = 3 y = 0
x = 4 y = 2
x = 5 y = 4
x = 6 y = 7
x = 7 y = 3

----解67:----
x = 0 y = 5
x = 1 y = 1
x = 2 y = 6
x = 3 y = 0
x = 4 y = 3
x = 5 y = 7
x = 6 y = 4
x = 7 y = 2

----解68:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 0
x = 3 y = 6
x = 4 y = 4
x = 5 y = 7
x = 6 y = 1
x = 7 y = 3

----解69:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 0
x = 3 y = 7
x = 4 y = 3
x = 5 y = 1
x = 6 y = 6
x = 7 y = 4

----解70:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 0
x = 3 y = 7
x = 4 y = 4
x = 5 y = 1
x = 6 y = 3
x = 7 y = 6

----解71:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 4
x = 3 y = 6
x = 4 y = 0
x = 5 y = 3
x = 6 y = 1
x = 7 y = 7

----解72:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 4
x = 3 y = 7
x = 4 y = 0
x = 5 y = 3
x = 6 y = 1
x = 7 y = 6

----解73:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 6
x = 3 y = 1
x = 4 y = 3
x = 5 y = 7
x = 6 y = 0
x = 7 y = 4

----解74:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 6
x = 3 y = 1
x = 4 y = 7
x = 5 y = 4
x = 6 y = 0
x = 7 y = 3

----解75:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 6
x = 3 y = 3
x = 4 y = 0
x = 5 y = 7
x = 6 y = 1
x = 7 y = 4

----解76:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 0
x = 3 y = 4
x = 4 y = 7
x = 5 y = 1
x = 6 y = 6
x = 7 y = 2

----解77:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 1
x = 3 y = 7
x = 4 y = 4
x = 5 y = 6
x = 6 y = 0
x = 7 y = 2

----解78:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 6
x = 3 y = 0
x = 4 y = 2
x = 5 y = 4
x = 6 y = 1
x = 7 y = 7

----解79:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 6
x = 3 y = 0
x = 4 y = 7
x = 5 y = 1
x = 6 y = 4
x = 7 y = 2

----解80:----
x = 0 y = 5
x = 1 y = 7
x = 2 y = 1
x = 3 y = 3
x = 4 y = 0
x = 5 y = 6
x = 6 y = 4
x = 7 y = 2

----解81:----
x = 0 y = 6
x = 1 y = 0
x = 2 y = 2
x = 3 y = 7
x = 4 y = 5
x = 5 y = 3
x = 6 y = 1
x = 7 y = 4

----解82:----
x = 0 y = 6
x = 1 y = 1
x = 2 y = 3
x = 3 y = 0
x = 4 y = 7
x = 5 y = 4
x = 6 y = 2
x = 7 y = 5

----解83:----
x = 0 y = 6
x = 1 y = 1
x = 2 y = 5
x = 3 y = 2
x = 4 y = 0
x = 5 y = 3
x = 6 y = 7
x = 7 y = 4

----解84:----
x = 0 y = 6
x = 1 y = 2
x = 2 y = 0
x = 3 y = 5
x = 4 y = 7
x = 5 y = 4
x = 6 y = 1
x = 7 y = 3

----解85:----
x = 0 y = 6
x = 1 y = 2
x = 2 y = 7
x = 3 y = 1
x = 4 y = 4
x = 5 y = 0
x = 6 y = 5
x = 7 y = 3

----解86:----
x = 0 y = 6
x = 1 y = 3
x = 2 y = 1
x = 3 y = 4
x = 4 y = 7
x = 5 y = 0
x = 6 y = 2
x = 7 y = 5

----解87:----
x = 0 y = 6
x = 1 y = 3
x = 2 y = 1
x = 3 y = 7
x = 4 y = 5
x = 5 y = 0
x = 6 y = 2
x = 7 y = 4

----解88:----
x = 0 y = 6
x = 1 y = 4
x = 2 y = 2
x = 3 y = 0
x = 4 y = 5
x = 5 y = 7
x = 6 y = 1
x = 7 y = 3

----解89:----
x = 0 y = 7
x = 1 y = 1
x = 2 y = 3
x = 3 y = 0
x = 4 y = 6
x = 5 y = 4
x = 6 y = 2
x = 7 y = 5

----解90:----
x = 0 y = 7
x = 1 y = 1
x = 2 y = 4
x = 3 y = 2
x = 4 y = 0
x = 5 y = 6
x = 6 y = 3
x = 7 y = 5

----解91:----
x = 0 y = 7
x = 1 y = 2
x = 2 y = 0
x = 3 y = 5
x = 4 y = 1
x = 5 y = 4
x = 6 y = 6
x = 7 y = 3

----解92:----
x = 0 y = 7
x = 1 y = 3
x = 2 y = 0
x = 3 y = 2
x = 4 y = 5
x = 5 y = 1
x = 6 y = 6
x = 7 y = 4

共有解 92 个
x = 1 y = 7
x = 2 y = 3
x = 3 y = 0
x = 4 y = 2
x = 5 y = 5
x = 6 y = 1
x = 7 y = 6

----解64:----
x = 0 y = 4
x = 1 y = 7
x = 2 y = 3
x = 3 y = 0
x = 4 y = 6
x = 5 y = 1
x = 6 y = 5
x = 7 y = 2

----解65:----
x = 0 y = 5
x = 1 y = 0
x = 2 y = 4
x = 3 y = 1
x = 4 y = 7
x = 5 y = 2
x = 6 y = 6
x = 7 y = 3

----解66:----
x = 0 y = 5
x = 1 y = 1
x = 2 y = 6
x = 3 y = 0
x = 4 y = 2
x = 5 y = 4
x = 6 y = 7
x = 7 y = 3

----解67:----
x = 0 y = 5
x = 1 y = 1
x = 2 y = 6
x = 3 y = 0
x = 4 y = 3
x = 5 y = 7
x = 6 y = 4
x = 7 y = 2

----解68:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 0
x = 3 y = 6
x = 4 y = 4
x = 5 y = 7
x = 6 y = 1
x = 7 y = 3

----解69:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 0
x = 3 y = 7
x = 4 y = 3
x = 5 y = 1
x = 6 y = 6
x = 7 y = 4

----解70:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 0
x = 3 y = 7
x = 4 y = 4
x = 5 y = 1
x = 6 y = 3
x = 7 y = 6

----解71:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 4
x = 3 y = 6
x = 4 y = 0
x = 5 y = 3
x = 6 y = 1
x = 7 y = 7

----解72:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 4
x = 3 y = 7
x = 4 y = 0
x = 5 y = 3
x = 6 y = 1
x = 7 y = 6

----解73:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 6
x = 3 y = 1
x = 4 y = 3
x = 5 y = 7
x = 6 y = 0
x = 7 y = 4

----解74:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 6
x = 3 y = 1
x = 4 y = 7
x = 5 y = 4
x = 6 y = 0
x = 7 y = 3

----解75:----
x = 0 y = 5
x = 1 y = 2
x = 2 y = 6
x = 3 y = 3
x = 4 y = 0
x = 5 y = 7
x = 6 y = 1
x = 7 y = 4

----解76:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 0
x = 3 y = 4
x = 4 y = 7
x = 5 y = 1
x = 6 y = 6
x = 7 y = 2

----解77:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 1
x = 3 y = 7
x = 4 y = 4
x = 5 y = 6
x = 6 y = 0
x = 7 y = 2

----解78:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 6
x = 3 y = 0
x = 4 y = 2
x = 5 y = 4
x = 6 y = 1
x = 7 y = 7

----解79:----
x = 0 y = 5
x = 1 y = 3
x = 2 y = 6
x = 3 y = 0
x = 4 y = 7
x = 5 y = 1
x = 6 y = 4
x = 7 y = 2

----解80:----
x = 0 y = 5
x = 1 y = 7
x = 2 y = 1
x = 3 y = 3
x = 4 y = 0
x = 5 y = 6
x = 6 y = 4
x = 7 y = 2

----解81:----
x = 0 y = 6
x = 1 y = 0
x = 2 y = 2
x = 3 y = 7
x = 4 y = 5
x = 5 y = 3
x = 6 y = 1
x = 7 y = 4

----解82:----
x = 0 y = 6
x = 1 y = 1
x = 2 y = 3
x = 3 y = 0
x = 4 y = 7
x = 5 y = 4
x = 6 y = 2
x = 7 y = 5

----解83:----
x = 0 y = 6
x = 1 y = 1
x = 2 y = 5
x = 3 y = 2
x = 4 y = 0
x = 5 y = 3
x = 6 y = 7
x = 7 y = 4

----解84:----
x = 0 y = 6
x = 1 y = 2
x = 2 y = 0
x = 3 y = 5
x = 4 y = 7
x = 5 y = 4
x = 6 y = 1
x = 7 y = 3

----解85:----
x = 0 y = 6
x = 1 y = 2
x = 2 y = 7
x = 3 y = 1
x = 4 y = 4
x = 5 y = 0
x = 6 y = 5
x = 7 y = 3

----解86:----
x = 0 y = 6
x = 1 y = 3
x = 2 y = 1
x = 3 y = 4
x = 4 y = 7
x = 5 y = 0
x = 6 y = 2
x = 7 y = 5

----解87:----
x = 0 y = 6
x = 1 y = 3
x = 2 y = 1
x = 3 y = 7
x = 4 y = 5
x = 5 y = 0
x = 6 y = 2
x = 7 y = 4

----解88:----
x = 0 y = 6
x = 1 y = 4
x = 2 y = 2
x = 3 y = 0
x = 4 y = 5
x = 5 y = 7
x = 6 y = 1
x = 7 y = 3

----解89:----
x = 0 y = 7
x = 1 y = 1
x = 2 y = 3
x = 3 y = 0
x = 4 y = 6
x = 5 y = 4
x = 6 y = 2
x = 7 y = 5

----解90:----
x = 0 y = 7
x = 1 y = 1
x = 2 y = 4
x = 3 y = 2
x = 4 y = 0
x = 5 y = 6
x = 6 y = 3
x = 7 y = 5

----解91:----
x = 0 y = 7
x = 1 y = 2
x = 2 y = 0
x = 3 y = 5
x = 4 y = 1
x = 5 y = 4
x = 6 y = 6
x = 7 y = 3

----解92:----
x = 0 y = 7
x = 1 y = 3
x = 2 y = 0
x = 3 y = 2
x = 4 y = 5
x = 5 y = 1
x = 6 y = 6
x = 7 y = 4

共有解 92 个

*/
原文地址:https://www.cnblogs.com/heqinghui/p/3204867.html