• UVa 11085


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

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

    分析:搜索,八皇后。由于八皇后仅仅有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
    ",cases ++,min);  
        }  
        return 0;
    }
    


  • 相关阅读:
    iOS- 移动端Socket UDP协议广播机制的实现
    iOS- 三步快速集成社交化分享工具ShareSDK
    iOS- iOS 7 的后台多任务 (Multitasking) 对比之前的异同、具体机制、变化
    iOS- Exception异常处理
    17. Subsets【medium】
    zookeeper程序员指南
    error while loading shared libraries错误解决
    82. Single Number【easy】
    53. Reverse Words in a String【easy】
    查看linux内核和版本信息
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6950825.html
Copyright © 2020-2023  润新知