zoukankan      html  css  js  c++  java
  • 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;
    }
    


  • 相关阅读:
    vue——图片懒加载v-lazy
    vue——利用intersectionOberver实现全局appear/disappear事件
    WXS-----学会使用WXS
    使用内联样式
    样式引入
    小程序开发框架----WXSS
    引入内部外部模板
    Selenium元素定位的几种方式
    Response Assertion(响应断言)
    参数化CSV Data Set config元件
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6950825.html
Copyright © 2011-2022 走看看