题目:给你一个棋盘上的八个皇后。每行一个。如今让他们互相不攻击,每一个皇后仅仅能竖着移动,

一次能够移动到本列的不论什么位置,问最少移动几步。能满足要求。

分析:搜索,八皇后。由于八皇后仅仅有92组解,直接计算出92组解,然后找出不在相应最少的一组解。

这里我使用了位运算来计算八皇后。降低代码量。

先考虑一个皇后的影响,每次下一层攻击的点和上一次的关系例如以下:

一个皇后会影响自己下方和左右两个斜的方向(从上往下搜索);

向左的斜的影响下一层向左移动一位,向右的影响向右移动一位;

因此。我们把三种影响分别用位表示。

L,M,R各自是三种情况的。之前全部皇后能攻击的点的位表示。

假设本次取第i个元素则三个元素相应位:

L =(L|(1<<i))<<1,M|(1<<i)。(R|(1<<i))>>1。

这里我是枚举选取的元素,能够利用位运算求出最后的可用位(-p&p)。

只是展开时麻烦点(由于是2^i,不是i)。

说明:注意回溯要保存状态。好久么刷题了╮(╯▽╰)╭。

#include <cstdlib>
#include <cstring>
#include <cstdio> int ans[92][8], temp[8], size = 0; void dfs(int d, int L, int M, int R)
{
if (d == 8) {
size ++;
return;
}
for (int i = 0; i < 8; ++ i)
if (((L|M|R)&(1<<i)) == 0) {
for (int j = 0; j < d; ++ j)
temp[j] = ans[size][j];
ans[size][d] = i+1;
dfs(d+1, (L|(1<<i))<<1, M|(1<<i), (R|(1<<i))>>1);
for (int j = 0; j < d; ++ j)
ans[size][j] = temp[j];
}
} int main()
{
size = 0;
dfs(0, 0, 0, 0); int cases = 1;
while (~scanf("%d",&temp[0])) {
for (int i = 1; i < 8; ++ i)
scanf("%d",&temp[i]); int min = 8;
for (int i = 0; i < size; ++ i) {
int count = 8;
for (int j = 0; j < 8; ++ j)
count -= (temp[j]==ans[i][j]);
if (min > count)
min = count;
} printf("Case %d: %d\n",cases ++,min);
}
return 0;
}

UVa 11085 - Back to the 8-Queens的更多相关文章

  1. UVa 750 - 8 Queens Chess Problem

    题目大意:八皇后问题,在一个8*8的棋盘上,放置8个皇后,使得任意两个皇后不在同一行上.不在同一列上.不在同一条对角线上,不过这道题预先给定了一个位置放置一个皇后,让你输出所有可能的答案. 经典的回溯 ...

  2. Uva 11538 - Chess Queen

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. uva 11195 Another queen (用状态压缩解决N后问题)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  5. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  6. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  7. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  8. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  9. UVA数学入门训练Round1[6]

    UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...

随机推荐

  1. NetworkX-画图

    参考:https://blog.csdn.net/qq951127336/article/details/54586869 1.创建图 networkx有四种图 Graph .DiGraph.Mult ...

  2. JS 前端 将图片转换为Base64利用H5 FileReader新特性

      file = document.getElementById("image"); var file=file.files[0]; var fileName=file.name; ...

  3. Python3基础笔记---面向对象

    只是对一些新的知识的记录 1.创建类 class ClassName: <statement-1> . . . <statement-N> 类实例化后,可以使用其属性,实际上, ...

  4. NOIp2018模拟赛四十三

    有了昨天的经验,不慌,开题先看source ******** 再看看题,看到C题标题: ******** 有毒... B题的“显然”50分结论推了我一个小时,然后就弃疗了... 成绩:0+50+5=5 ...

  5. Linux ping 不通 域名 添加DNS

    修改路由配置文件 vi /etc/resolv.conf # Generated by NetworkManager #NDS nameserver 192.168.32.2 redhat7 系统优化 ...

  6. 紫书 习题 8-16 UVa 1618 (中途相遇法)

    暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相 ...

  7. python中的try...except...finally函数

    异常Error 我们在写代码的时候,经常会遇见程序抛出Error无法执行的情况 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Python脚本发 ...

  8. hadoop-03-安装java

    hadoop-03-安装java 1,su root 2, rpm -qa|grep jdk #查看已经安装的jdk 3,rpm -e --nodeps `rpm -qa|grep jdk ` #删除 ...

  9. Invalid project description.

    1.错误描写叙述 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/ ...

  10. 双系统给ubuntu增加分区

    http://www.th7.cn/system/lin/201506/106338.shtml http://www.linuxidc.com/Linux/2012-06/61983.htm 因为本 ...