zoukankan      html  css  js  c++  java
  • 洛谷P1219 八皇后

    题目描述

    检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

    上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

    行号 1 2 3 4 5 6

    列号 2 4 6 1 3 5

    这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。

    输入输出格式

    输入格式:

    一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

    输出格式:

    前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

    输入输出样例

    输入样例#1:

    6

    输出样例#1:
    2 4 6 1 3 5
    3 6 2 5 1 4
    4 1 5 2 6 3
    4

    代码如下

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int N = 101;        //对角线 2n - 1 
     5 int n, cnt = 0;
     6 int path[N], col[N], dg[N], undg[N];    //col 列  dg 对角线  undg 反对角线  
     7 void dfs(int u){
     8     if(u == n){
     9         if(cnt < 3){
    10             for(int i = 0; i < n; i++)    printf("%d ", path[i]);
    11             printf("
    ");
    12        }
    13         cnt++;
    14         return;            /***/
    15    }
    16    for(int i = 0; i < n; i++){
    17        if(!col[i] && !dg[u + i] && !undg[i - u + n]){
    18            path[u] = i + 1;
    19            col[i] = dg[u + i] = undg[i - u + n] = 1;
    20            dfs(u + 1);
    21            col[i] = dg[u + i] = undg[i - u + n] = 0;
    22        }
    23    }
    24 }
    25 int main(){
    26     scanf("%d", &n);
    27     dfs(0);
    28     printf("%d
    ", cnt);
    29     return 0;
    30 }    
    八皇后
  • 相关阅读:
    获取屏幕分辨率
    String-去除-指定-字符-操作
    Log4j配置详述
    Java-String-数据乱码
    javascript高级课程-3
    javascript高级课程-2
    javascript高级课程-1
    设计一个算法双链表删除重复
    设计一个算法将一个顺序表逆置
    w3c标准
  • 原文地址:https://www.cnblogs.com/zoom1109/p/11182298.html
Copyright © 2011-2022 走看看