题目描述:Checker Challenge
 1000(ms)
 10000(kb)
 20 / 90

Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so that one and only one is placed in each row and each column, and there is never more than one in any diagonal. (Diagonals run from southeast to northwest and southwest to northeast and include all diagonals, not just the major two.)

          Column
1 2 3 4 5 6
-------------------------
1 | | O | | | | |
-------------------------
2 | | | | O | | |
-------------------------
3 | | | | | | O |
-------------------------
4 | O | | | | | |
-------------------------
5 | | | O | | | |
-------------------------
6 | | | | | O | |
-------------------------

The solution shown above is described by the sequence 2 4 6 1 3 5, which gives the column positions of the checkers for each row from 1 to 6:

ROW 1 2 3 4 5 6
COLUMN 2 4 6 1 3 5

This is one solution to the checker challenge. Write a program that finds all unique solution sequences to the Checker Challenge (with ever growing values of N). Print the solutions using the column notation described above. Print the the first three solutions in numerical order, as if the checker positions form the digits of a large number, and then a line with the total number of solutions.

Special note: the larger values of N require your program to be especially efficient. Do not precalculate the value and print it (or even find a formula for it); that's cheating. Work on your program until it can solve the problem properly.

输入

A single line that contains a single integer N (6 <= N <= 13) that is the dimension of the N x N checkerboard.

输出

The first three lines show the first three solutions found, presented as N numbers with a single space between them. The fourth line shows the total number of solutions found.

样例输入

6

样例输出

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
提 交

gcc
 
 
 
 
 
1
 
 

解题思路:N皇后问题,一般的DFS会超时,用位运算才可以A。

////// Checker Challenge.cpp : 定义控制台应用程序的入口点。
//////
////
#include "stdafx.h"
////
////
////#include <stdio.h>
////#include <math.h>
////#include <string.h>
////
////int n, ans;
////int res[15],save[15];
////
////struct R
////{
//// int r[15][15];
////
////}R[15];
////
////void DFS(int i)
////{
//// if (i == n)
//// {
//// ans++;
//// if (ans <= 3)
//// {
//// memcpy(R[n].r[ans-1], res, sizeof(res));
//// }
//// return;
//// }
////
//// for (int k = 0; k < n; k++)//遍历所有列
//// {
//// int j;
//// for (j = 0; j < i; j++)//和已经放好的皇后位置比较
//// {
//// if (k == res[j]) break;
//// if (abs(k - res[j]) == i - j) break;
//// }
//// if (j >= i)
//// {
//// res[i] = k;
//// DFS(i + 1);
//// }
//// }
////}
////
////int main()
////{
//// for (n = 0; n <= 13; n++)
//// {
//// ans = 0;
//// DFS(0);
//// save[n] = ans;
////
//// }
//// while (scanf("%d",&n)!=EOF)
//// {
////
//// for (int j = 0; j < 3; j++)
//// {
//// for (int i = 0; i < n; i++)
//// {
//// if (i != n-1) printf("%d ", R[n].r[j][i] + 1);
////
//// else printf("%d\n", R[n].r[j][i] + 1);
//// }
//// }
//// printf("%d\n", save[n]);
////
//// }
////} //简化的思想:
//用位运算代替for循环遍历每个皇后的位置
//用垂直、对角线、斜对角线的位运算 /*整个逻辑:
//1.求将要放入皇后的位置
//2.更新可放皇后的位置
//3.DFS循环*/ #include <stdio.h> int n,ans,uplimit,res[]; int binary2(int num)
{
int ans = ;
while (num)
{
num = num >> ;
ans++;
}
return ans;
} void DFS(int i,int vertical, int diagonal, int antidiagonal)
{
if (i >= n)
{
ans++;
if (ans <=)
{
//输出结果
for (int i = ; i < n; i++)
{
if (i != n-) printf("%d ", res[i]);
else printf("%d\n", res[i]);
}
}
return;
}
int avail = uplimit & (~(vertical | diagonal | antidiagonal));
while (avail)
{
int pos = avail & (-avail);
avail = avail - pos;
res[i] = binary2(pos);
DFS(i + ,vertical + pos, (diagonal + pos) << , (antidiagonal + pos) >> );
} } int main()
{
while (scanf("%d", &n) != EOF)
{
ans = ;
uplimit = ( << n) - ;
DFS(, , , );
printf("%d\n", ans);
}
return ;
}

ACM-Checker Challenge的更多相关文章

  1. USACO1.5 Checker Challenge(类n皇后问题)

    B - B Time Limit:1000MS     Memory Limit:16000KB     64bit IO Format:%lld & %llu   Description E ...

  2. USACO 6.5 Checker Challenge

    Checker Challenge Examine the 6x6 checkerboard below and note that the six checkers are arranged on ...

  3. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  4. TZOJ 3522 Checker Challenge(深搜)

    描述 Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so th ...

  5. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

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

  6. Checker Challenge跳棋的挑战(n皇后问题)

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

  7. USACO training course Checker Challenge N皇后 /// oj10125

    ...就是N皇后 输出前三种可能排序 输出所有可能排序的方法数 vis[0][i]为i点是否已用 vis[1][m+i]为i点副对角线是否已用  m+i 为从左至右第 m+i 条副对角线 vis[1] ...

  8. N皇后问题2

    Description Examine the  checkerboard below and note that the six checkers are arranged on the board ...

  9. USACO 完结的一些感想

    其实日期没有那么近啦……只是我偶尔还点进去造成的,导致我没有每一章刷完的纪念日了 但是全刷完是今天啦 讲真,题很锻炼思维能力,USACO保持着一贯猎奇的题目描述,以及尽量不用高级算法就完成的题解……例 ...

随机推荐

  1. 十五、web中处理乱码问题总结

    一.jsp变成之道---中文乱码 jsp在转换为Servlet的过程经过三次编码转化: 转自  http://www.cnblogs.com/chenssy/p/4235191.html 二.java ...

  2. webpack 4 脚手架搭建

    1.在cmd控制台安装环境  npm install express (这是一个本地服务器配置) 2.在src 文件夹下建 mian.js 和 express.js 两个jS文件

  3. 如何对接网建SMS短信通短信验证码接口

    1首先注册登录网建SMS网站  http://www.smschinese.cn/ 2.下载Java代码 3.JAVA调用 import java.io.UnsupportedEncodingExce ...

  4. spingboot中使用scheduled设置定时任务注意事项

    在spring开发过程中经常会遇到需要定时执行的任务,如定时生成报表,定时推送消息等任务. springboot 提供了简单的 @Scheduled 表达式来配置定时任务.该方式默认是单线程的,任务在 ...

  5. 089、Java中String类之利用构造方法实例化

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  6. 069、Java面向对象之对象引用传递

    01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...

  7. SQL Server DATEADD() 函数 一步步使用教程

    SQL Server DATEADD() 函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. DATEADD(datepart,number,date)date 参数是合法的日期表达式. ...

  8. Redis散列表类型

    散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他的数据类型. 一个散列类型键可以包含至多2^32 -1个字段. 命令 赋值 HSE ...

  9. 吴裕雄--天生自然JAVAIO操作学习笔记:字节流与字符流操作

    import java.io.* ; public class Copy{ public static void main(String args[]){ if(args.length!=2){ // ...

  10. Lua生成比较理想的随机数的方法

    lua需要生成随机数的需求也是很常见的,为了生成看起来更随机的数字,我们需要注意以下几点 我们也需要给随机数设置随机数种子:math.randomseed(xx) lua对随机数种子也是有一定要求的: ...