zoukankan      html  css  js  c++  java
  • 洛谷1219 八皇后 解题报告

    洛谷1219 八皇后

    本题地址: http://www.luogu.org/problem/show?pid=1219

    题目描述

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

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

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

    //以下的话来自usaco官方,不代表洛谷观点
    特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了!

    输入输出格式

    输入格式:

    一个数字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
    

    说明

    题目翻译来自NOCOW。
    USACO Training Section 1.5

    题解

    深搜DFS

    经典的n皇后问题。

    我们可以按行来分层,每层的选择就是皇后在本行放的位置,当本层的皇后找到位置后就进入下一层,如果本层的每个位置都尝试过,则返回上一层。

    当n层的皇后都已放好时,方案数+1,当返回第一层,发现第一层的各个位置都已尝试过,则搜索结束。

    下面附上代码。

    代码

    1. var    
    2. a,b,c:array[-30..30] of boolean;    
    3. num,u,n:longint;    
    4. place:array[1..20] of longint;    
    5. procedure print;    
    6. var    
    7. i:longint;    
    8. begin    
    9.   for i:=to n do write(place[i],' ');    
    10.   writeln;    
    11. end;    
    12. procedure search(x:longint);    
    13. var    
    14. o:longint;    
    15. begin    
    16.   if x>n then    
    17.   begin    
    18.     inc(num);    
    19.     if num<=then print();    
    20.     exit;    
    21.   end;    
    22.   for o:=to n do    
    23.     if (a[o]=true) and (b[o+x]=true) and (c[x-o]=true) then    
    24.     begin    
    25.       a[o]:=false;    
    26.       b[o+x]:=false;    
    27.       c[x-o]:=false;    
    28.       place[x]:=o;    
    29.       search(x+1);    
    30.       a[o]:=true;    
    31.       b[o+x]:=true;    
    32.       c[x-o]:=true;    
    33.     end;    
    34. end;    
    35. begin    
    36.   for u:=-20 to 30 do    
    37.   begin    
    38.     a[u]:=true;    
    39.     b[u]:=true;    
    40.     c[u]:=true;    
    41.   end;    
    42.   readln(n);    
    43.   search(1);    
    44.   writeln(num);    
    45. end.

    (本文系笔者原创,未经允许不得转载)

  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/yzm10/p/4751976.html
Copyright © 2011-2022 走看看