• C


    Description

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 
    你的任务是,对于给定的N,求出有多少种合法的放置方法。 

     

    Input

    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
     

    Output

    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
     

    Sample Input

    1 8 5 0
     

    Sample Output

    1 92 10
     
     
    题目要求:输入n
         建立一个n行n列的矩阵,矩阵中能放n个皇后,任意两个皇后不能再同一行或者同一列,任意两个皇后的连线不能与边界成∠45°
         问有多少种排列方法
    分析:根据要求可以推出每一行每一列都至少有一个皇后
       用搜索寻找第x行的皇后放在哪一列上了,标记上这个位置,同时把其他不能放的位置也都标记下
       最后一行找完之后进入第dfs(n+1),这个时候方法数加一
     
     
    代码:
    /*
        注意:1:写死循环要么注意跳出条件,要么就别写
              2: 复制粘贴的前面用的代码的时候一定记得把所有需要修改的条件都改了
    */
    
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    int cnt, n;
    int vis[11][11];
    
    void dfs(int x)
    {
        if(x == n+1)
        {
            cnt++;
            return;
        }
        for(int i = 1; i <= n; i++) ////////////////////////////////////////
        {
            if(!vis[x][i])
            {
                for(int j = x; j <= n; j++)
                {
                    vis[j][i]++;
                }
                for(int j = 1; 1; j++)
                {
                    if(x+j <= n)
                    {
                        if(i+j <= n)
                            vis[x+j][i+j]++;
                        if(i - j >= 1)
                            vis[x+j][i-j]++;
                    }
                    else
                        break;//////////////////////////////////////////////////////
                }
                dfs(x+1);
                for(int j = x; j <= n; j++)
                    vis[j][i]--;
                for(int j = 1; 1; j++)
                {
                    if(x+j <= n)
                    {
                        if(i+j <= n)
                            vis[x+j][i+j]--;
                        if(i - j >= 1)
                            vis[x+j][i-j]--;
                    }
                    else
                        break;/////////////////////////////////////////////////////////////////
                }
            }
        }
    }
    int main()
    {
        int ans[11], i;
        memset(ans, 0, sizeof(ans));
        for(i = 1; i <= 10; i++)
        {
            n = i;
            cnt = 0;
            memset(vis, 0, sizeof(vis));
            dfs(1);
            ans[i] = cnt;
            //printf("ans[%d] = %d
    ", i, ans[i]);
        }
        while(scanf("%d", &n), n)
            printf("%d
    ", ans[n]);
        return 0;
    }
  • 相关阅读:
    AUDIOqueue 为什么会播放一段时间就听不到声音
    逆序一位数数组求和
    求数组中两数之和等于target的两个数的下标
    iOS获取崩溃日志
    如何看iOS崩溃日志
    关于iOS刷新UI需要在主线程执行
    iOS内置麦克风选择方法
    贝叶斯深度学习-概述
    空间统计(Spatial Statistics)学习笔记(一)— 概述
    重采样技术—Bootstrap
  • 原文地址:https://www.cnblogs.com/rain-1/p/4975714.html
Copyright © 2020-2023  润新知