UVa 11085 - Back to the 8-Queens

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

一次可以移动到本列的任何位置,问最少移动几步,能满足要求。

分析:搜索,八皇后。因为八皇后只有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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-21 00:50:05

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

UVa 750 - 8 Queens Chess Problem

题目:计算一定经过给定点的八皇后. 分析:搜索.因为八皇后只有92组解,直接计算出92组解,然后查询输出即可. 这里我使用了位运算来计算八皇后,减少代码量. 先考虑一个皇后的影响,每次下一层攻击的点和上一次的关系如下: 一个皇后会影响自己下方和左右两个斜的方向(从上往下搜索): 向左的斜的影响下一层向左移动一位,向右的影响向右移动一位: 因此,我们把三种影响分别用位表示, L,M,R分别是三种情况的,之前所有皇后能攻击的点的位表示: 如果本次取第i个元素则三个元素对应位: L =(L|(1<<

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

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2136 Problem A Another n-Queen Problem I guess the n-queen problem is known by every person who has studied backtracking. In this problem you s

UVA The Sultan&#39;s Successors

题目如下: The Sultan's Successors  The Sultan of Nubia has no children, so she has decided that thecountry will be split into up to k separate parts on her death andeach part will be inherited by whoever performs best at some test. Itis possible for any

UVa 10420 List of Conquests

题意就是有N个pl妹子,然后每行第一个单词是妹子的国籍,后面是妹子的名字. 你的任务就是统计相同国籍妹子的个数,然后按字母表顺序输出. 我首先把所有的国籍都读入,然后用qsort()按字母表顺序排序. List of ConquestsInput: standard inputOutput: standard outputTime Limit: 2 seconds In Act I, Leporello is telling Donna Elviraabout his master's long

UVA The Sultan&#39;s Successors (八皇后问题)

 The Sultan's Successors  The Sultan of Nubia has no children, so she has decided that the country will be split into up to k separate parts on her death and each part will be inherited by whoever performs best at some test. It is possible for any in

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED