zoukankan      html  css  js  c++  java
  • poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)

    http://poj.org/problem?id=1222

    题意:给一个确定的5*6放入矩阵。每一个格子都有一个开关和一盏灯,0表示灯没亮,1表示灯亮着。让你输出一个5*6的矩阵ans[i][j],ans[i][j] = 1表示按下开关,ans[i][j] = 0表示不按开关,使最后全部的灯都熄灭。


    思路:与http://acm.hdu.edu.cn/showproblem.php?pid=1882类似。在这里找到一种方案输出就可以。但有一个疑惑不解。最后ans[ ][ ]输出的时候每一行里要倒着输出。。。

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <stack>
    #include <vector>
    #include <queue>
    #define LL long long
    #define _LL __int64
    using namespace std;
    const int INF = 0x3f3f3f3f;
    
    int map[7][7];
    int sta[7],tmp[7];
    int ans[7][7];
    int bit[8] = {1,2,4,8,16,32,64,128};
    
    void solve()
    {
    	for(int i = 0; i < (1<<6); i++)
    	{
    		memcpy(tmp,sta,sizeof(sta));
    		memset(ans,0,sizeof(ans));
    
    		for(int j = 0; j < 6; j++)
    		{
    			if(bit[j]&i)
    			{
    				ans[0][j] = 1;
    				if(j > 0)
    					tmp[0] ^= bit[j-1];
    				if(j < 5)
    					tmp[0] ^= bit[j+1];
    				tmp[0] ^= bit[j];
    				tmp[1] ^= bit[j];
    			}
    		}
    
    		for(int j = 1; j < 5; j++)
    		{
    			for(int k = 0; k < 6; k++)
    			{
    				if(bit[k]&tmp[j-1])
    				{
    					ans[j][k] = 1;
    					if(k > 0)
    						tmp[j] ^= bit[k-1];
    					if(k < 5)
    						tmp[j] ^= bit[k+1];
    					tmp[j] ^= bit[k];
    					tmp[j+1] ^= bit[k];
    				}
    			}
    		}
    		if(!tmp[4])
    		{
    			for(int i = 0; i < 5; i++)
    			{
    				for(int j = 5; j > 0; j--)
    					printf("%d ",ans[i][j]);
    				printf("%d
    ",ans[i][0]);
    			}
    			break;
    		}
    
    	}
    }
    
    int main()
    {
    	int test;
    	scanf("%d",&test);
    	int item = 1;
    	while(test--)
    	{
    		memset(sta,0,sizeof(sta));
    		for(int i = 0; i < 5; i++)
    		{
    			for(int j = 0; j < 6; j++)
    			{
    				scanf("%d",&map[i][j]);
    				if(map[i][j] == 0)
    					sta[i] <<= 1;
    				else sta[i] = (sta[i]<<1)+1;
    			}
    		}
    		printf("PUZZLE #%d
    ",item++);
    		solve();
    	}
    	return 0;
    
    }


  • 相关阅读:
    线程join
    java线程 WaitAndNotify
    java线程死锁
    多线程并发的3个特性
    常用字符串搜索算法介绍
    [原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法
    [原创]字符串多模匹配算法之AC自动机理解心得
    客户端javascript访问服务器控件的方法
    [总结]C++实现一个限制对象实例个数的类
    [原创]我的北大ACM POJ1001解答
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5069516.html
Copyright © 2011-2022 走看看