zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        printf("===============
    ");
    }
    
    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
    ",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("
    ");
    //    }
    //    printf("=====================================
    ");
    //}
    //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
    ", tot);
    //    return 1;
    //}
    
    




  • 相关阅读:
    leetcode390
    leetcode388
    leetcode373
    leetcode368
    leetcode372
    leetcode386
    基于自定义协议的服务器高并发处理之:多线程模型
    基于自定义协议的服务器高并发处理之:多进程模型
    macos下简单的socket服务器+客户端
    Windows下编译Libevent
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264915.html
Copyright © 2011-2022 走看看