题目描述: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. updatexml()报错注入

    首先了解下updatexml()函数 UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为X ...

  2. bootstrap选项卡页面中如何关闭当前选项卡及页面

    再具体说一下现在的需求: 如上界面:在新闻发布界面有一个按钮,在点击按钮的时候我需要直接把这个打开的选项卡关闭 实现思路: 1)关闭选项卡对应的页面     2)去除上方选项卡      3)激活前一 ...

  3. Broadcast机制(二)

    内容提纲: 在本节课当中,我会继续为大家讲解Android的广播机制,重点内容有以下的两个方面: a)         在应用程序当中注册BroadcastReceiver的方法 b)         ...

  4. 横竖屏切换Activity的生命周期

    横竖屏切换的时候Activity的生命周期如下: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> ...

  5. Day4-B-最短路径问题 HDU3790

    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input输入n,m,点的编号是1~n,然后是m行 ...

  6. array_multisort 对关联数组进行排序的问题 PHP

    我们在php的数组操作中经常用到对数组进行排序的问题,这里说的是对关联数组进行排序需要用到函数 array_multisort . array_multisort(array_column($arr, ...

  7. [noip2014]P2312 解方程

    P2312 解方程 其实这道题就是求一个1元n次方程在区间[1, m]上的整数解. 我们枚举[1, m]上的所有整数,带进多项式中看看结果是不是0即可. 这里有一个技巧就是秦九韶算法,请读者自行查看学 ...

  8. Ubuntu操作系统部署zabbix agent服务

    Ubuntu操作系统部署zabbix agent服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.下载zabbix软件包 博主推荐阅读: https://www.cnblog ...

  9. Timer(阿里CTF)

    下载文件之后发现是.apk类型文件,于是百度搜索了一下推荐再电脑上安装安卓模拟器,都尝试了一下逍遥安卓是真的不好用,小白觉得还是BlueStacks好用一些,下载之后去安装打开就看到了, 什么都没有发 ...

  10. 023、MySQL取文本长度取字符串长度

    #取文本长度,一个文字算1长度 SELECT CHAR_LENGTH('田攀520'); #UTF-8的数据库,值为5 #取文本长度,汉字算多个字符,数字和英文算一个字符 SELECT LENGTH( ...