n皇后



在n*n的棋盘上放n个皇后,使得她们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
//关于八皇后问题,其实就是一个简单的深搜,只要把同行和同对角线的全排除掉就行了
//因为cur-i可能小于0,所以加一个n,把数组开大点就行了
int n;
int vis[100][100];
int tot;
int a[1000]= {0};

void print(int k)//打印图
{
    int i;
    int j;
    for(i = 0; i <n; i ++)
    {
        for(j=0; j<a[i]; j++)
            printf("* ");
        printf("# ");
        for(j=a[i]+1; j<n; j++)
            printf("* ");
        printf("\n");
    }
    printf("===============\n");
}

void dfs(int cur)
{
    int i;
    if(cur==n)
    {
        tot++;
        print(a[cur]);
    }
    else for(i=0; i<n; i++)
        {
            if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
            {
                a[cur]=i;
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
                dfs(cur+1);
                vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
            }
        }
}

int main()
{
    while(~scanf("%d",&n))
    {
        memset(vis,0,sizeof(vis));
        tot=0;
        dfs(0);
        printf("%d\n",tot);
    }
    return 0;
}



//打印8*8的
//#include <iostream>
//#include<stdio.h>
//using namespace std;
//
//int a[8] = {0};
//int tot = 0;
//
//void print()//打印图
//{
//    int i;
//    int j;
//    for(i = 0; i <8; i ++)
//    {
//        for(j = 0; j < a[i]; j ++)
//            printf("* ");
//        printf("# ");
//        for(j = a[i] + 1; j < 8; j ++)
//            printf("* ");
//        printf("\n");
//    }
//    printf("=====================================\n");
//}
//int fund(int cur, int x)//判断是否和其他皇后同行或同对角线
//{
//    int i,x1;
//    for(i = 0; i < cur; i ++)
//    {
//        x1 = a[i];
//        if(x == x1)
//            return 0;
//        if((i + x1) == (cur + x))
//            return 0;
//        if((i - x1) == (cur - x))
//            return 0;
//    }
//    return 1;
//}
//void search(int cur)
//{
//    int i;
//    for(i = 0; i < 8; i++)
//    {
//        if(fund(cur, i))//如果符合条件
//        {
//            a[cur] = i;//摆放皇后
//            if(7 == cur)
//            {
//                tot ++, print();
//                a[cur] = 0;
//                return;
//            }
//            search(cur + 1);
//            a[cur] = 0;
//        }
//    }
//}
//int main()
//{
//    search(0);
//    printf("total = %d\n", tot);
//    return 1;
//}





posted @ 2016-11-03 20:27  xushukui  阅读(192)  评论(0编辑  收藏  举报