TYVJ P1080 N皇后

描述

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

列号
   1  2  3  4  5  6

  -------------------------

1 |  | O |  |  |  |  |

  -------------------------

2 |  |  |  | O |  |  |

  -------------------------

3 |  |  |  |  |  | O |

  -------------------------

4 | O |  |  |  |  |  |

  -------------------------

5 |  |  | O |  |  |  |

  -------------------------

6 |  |  |  |  | O |  |

  -------------------------

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 
行号 1 2 3 4 5 6 
列号 2 4 6 1 3 5 
这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。 
特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆tyvj的帐号将被无警告删除

输入格式

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

输出格式

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

测试样例1

输入

6

输出

2 4 6 1 3 5 
3 6 2 5 1 4 
4 1 5 2 6 3 
4

备注

usaco

复习一下位运算~

算法其实还有优化空间

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n;
 5 int tar;
 6 int ans=0;
 7 int a[20];
 8 void dfs(int now,int la,int ra,int dep){
 9     if(now==tar){
10         ans++;
11         if(ans<=3){
12             for(int j=1;j<=n;j++)printf("%d ",a[j]);
13             printf("\n");
14         }
15         return;
16     }
17     int x=now|la|ra;
18     for(int i=0;i<n;i++){
19         if((x&(1<<i))==0){
20             a[dep]=i+1;
21             dfs(now|(1<<i),(la+(1<<i))<<1,(ra+(1<<i))>>1,dep+1);
22
23         }
24     }
25 }
26 int main(){
27     scanf("%d",&n);
28     tar=(1<<n)-1;
29     for(int i=0;i<n;i++){
30         int pos=1<<i;
31         a[1]=i+1;
32         dfs(pos,pos<<1,pos>>1,2);
33     }
34     printf("%d\n",ans);
35     return 0;
36 }
时间: 2024-11-11 00:10:25

TYVJ P1080 N皇后的相关文章

TYVJ P1080 N皇后 Label:dfs PS:以前做的一道题,贴出来防忘

描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 列号  1  2  3  4  5  6 ------------------------- 1 |  | O |  |  |  |  | ------------------------- 2 |  |  |  | O |  |  | ------------------------- 3 |  |  |  |  |  | O | -----

N皇后//搜索入门

P1080 N皇后 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 列号  1  2  3  4  5  6 ------------------------- 1 |  | O |  |  |  |  | ------------------------- 2 |  |  |  | O |  |  | --

八皇后问题

#include <stdio.h> #include <stdlib.h> #define Maxsize 100 typedef struct node{ int _x; int _y; }chessman,*chess; static int cnt=0; static chessman c[Maxsize]; bool isOK(chess c,chessman cm,int c_len){ //判断是否能将当前皇后加入棋盘中 for(int i=0;i<c_len;

8皇后

#include <stdio.h>#include <math.h>#include <time.h>#define max 1000int sum=0;bool place (int k,int x[]){ for (int j=1;j<k;j++)if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false;return true;} void backtrack (int t,int x[],int

2n皇后问题

在蓝桥杯基础训练题中,出现这样一道题目: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输出格式 输出一个整数,表示总

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

TYVJ 2049 魔法珠 sg函数

题意:链接 方法:sg函数 解析: tyvj的题大部分都没题解啊- - 不过这样貌似会更好?感觉做这的题都需要自己动脑啊- - 虽然嘴上说着好烦然而心里觉得好评? 回归正题 设sg[x]表示数x的sg值,这好像是废话 然后对于读入的a[i],将所有的a[i]的sg值异或起来如果不是零则先手赢反之后手 维护的时候有个坑. 每次求约数的时候,数组要在sg里开,因为如果递归下去的话,全局变量的话会被更改,会被坑死. 然后就是怎么维护了 对于x,先求约数 之后枚举哪个数不取,将其他的异或(或者先都异或起

回溯法——求解N皇后问题

问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上.可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行.同一列或同一斜线上. 问题分析 我们以最简单的4皇后问题分析,显然,为了使皇后不相互攻击,首先考虑每一行只能放一个皇后,我们以X[1,2,3-.N]代表此问题的解数组,X[N]代表在第N行第X[N]列放了一个皇后,例如,X[2

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I