`

POJ1176 Party Lamps-DFS枚举,异或作为状态转移函数

 
阅读更多

1. 灯每6个一组状态循环一次:
==> 只需要枚举灯"1,2,3,4,5,6即可",之后的状态在输出时按要求循环输出即可。

2. 异或操作 作为 状态转移函数可以大大减少状态枚举的搜索树深度:
——异或满足“交换律(已证-真值表)”和“结合律(已证-真值表)”;偶数次异或操作将不对状态产生任何影响。
==> 只需要考虑每种灯被按下0次/1次的所有组合情况即可

 

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int n,c,t;
bool f[101];    //初始状态 11...11 
bool g[101];    //当前状态 
int last[101];  //最终状态限制 (-1没有指定;1 ON;0 OFF) 

bool judge()
{
     for(int i=1; i<=n; i++)
             if(last[i]!=-1&&last[i]!=g[i])
              return false;
     return true;
}

void turn1()
{
     for(int i=1; i<=n; i++)
           g[i]=!g[i];
}

void turn2()
{
     for(int i=1; i<=n; i+=2)
          g[i]=!g[i];
}

void turn3()
{
     for(int i=2; i<=n;i+=2)
             g[i]=!g[i];
}

void turn4()
{
     
     for(int i=0,k=1; k<=n;)
     {
           g[k]=!g[k];
           i++;
           k=3*i+1;
     }
}

int main()
{
    cin>>n;
    cin>>c;
    
    vector<string> vec;
    string s;
    
    for(int i=1; i<=n; i++)f[i]=1;
    for(int i=1; i<=n; i++)last[i]=-1;
    while(cin>>t&&t!=-1)
            last[t]=1;   
    while(cin>>t&&t!=-1)
          last[t]=0;
 
    //枚举状态 
    int i1, i2, i3, i4,i;
    for(i1=0; i1<=1; i1++)
    for(i2=0; i2<=1; i2++)
    for(i3=0; i3<=1; i3++)
    for(i4=0; i4<=1; i4++){
              if( c>=(i1+i2+i3+i4) &&(c-(i1+i2+i3+i4))%2==0)    //c-(i1+i2+i3+i4))%2==0 ==>最终翻转次数必须为c 
              {
                      for(i=1; i<=n;i++)
                              g[i]=f[i];
                      if(i1)turn1();
                      if(i2)turn2();
                      if(i3)turn3();
                      if(i4)turn4();
                      
                      if(judge()){
                           //1. 数字i转为对应字符'i'    i.e. 1 --> '1' ('1'='0'+1)
                           //2. string s=""; 
                           //   (1)可以追加字符串: s+="blabla";
                           //   (2)可以追加字符:s+='b'; 
                           for(s="",i=1; i<=n; i++)
                                 s+='0'+g[i];
                           vec.push_back(s);
                      }
              }
    }
    
    //对vector<string>vec 进行sort(...)可以保证元素按照字典序进行排列 
    sort(vec.begin(),vec.end());
    
    if(vec.size()==0)cout<<"IMPOSSIBLE"<<endl;
    else{
       for(i=0; i<vec.size(); i++)
                cout<<vec[i]<<endl;
    }       
    
    system("pause");
    return 0;
}
 
分享到:
评论

相关推荐

    POJ1258-Agri-Net【Prim】

    1. 初始化:选择图中的任意一个顶点作为初始最小生成树的一部分。 2. 建立一个空集合,将已加入最小生成树的顶点放入其中。 3. 对于图中其他未加入集合的顶点,找出与集合内顶点相连的边中权值最小的一条。 4. 将这...

    POJ2299-Ultra-QuickSort

    【标题】"POJ2299-Ultra-QuickSort"是北京大学在线判题系统POJ上的一道编程题目,其主要涉及的算法是快速排序(Ultra-QuickSort)。快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用...

    POJ水题集--50道--增加自信

    POJ水题集-----50道左右-----增加自信啊..

    POJ1002-487-3279【Hash+Qsort】

    标题中的"POJ1002-487-3279【Hash+Qsort】"是指一个编程挑战题目,通常在在线编程平台上出现,比如北京大学的Peking Online Judge (POJ)。这个题目结合了哈希表(Hash)和快速排序(Qsort)两种算法来解决问题。哈希...

    POJ3292-Semi-prime H-numbers

    【标题】"POJ3292-Semi-prime H-numbers"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。这个题目主要涉及数论和算法设计,特别是关于半素数(Semi-prime)的概念以及H-...

    poj训练计划.doc

    - 枚举:通过列举所有可能的情况来解决问题,例如`poj1753, poj2965`。 - 贪心算法:在每一步选择中都采取在当前状态下最好或最优的选择,如`poj1328, poj2109, poj2586`。 - 分治法:将一个复杂的问题分成两个或...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    描述“北大POJ3253-POJ3253-Fence Repair【STL优先队列】解题报告+AC代码”表明这是一篇关于如何解答此题目的报告,其中包含了通过AC(Accepted)状态的代码,即代码已经成功通过了所有测试用例。解题报告通常会涵盖...

    POJ1014-Dividing【DFS】【多重背包+二进制优化】

    标题中的“POJ1014-Dividing”是指北京大学在线编程平台POJ(Problemset Online Judge)上的一个问题编号为1014的题目。这个题目通常会涉及到计算机科学和算法设计,特别是优化问题的解决方案。这里的关键词是“DFS...

    POJ解题报告--1005

    ### POJ解题报告--1005 #### 题目概述 本题要求编写一个程序,模拟根据地块的半圆面积计算该地块开始侵蚀的年份。具体来说,对于每个地块,输入两个坐标值(x 和 y),分别表示地块在平面直角坐标系中的位置。然后...

    poj 3131 Cubic Eight-Puzzle.md

    poj 3131 Cubic Eight-Puzzle.md

    poj 2196 Specialized Four-Digit Numbers.md

    poj 2196 Specialized Four-Digit Numbers.md

    poj部分源码--Java

    poj平台有关数据结构题的Java源码 1159 1276 2406 2502 2509 2513 2533 2778 3176

    非常全的poj答案库 1164-1874 1000-4007

    标题中的“非常全的poj答案库 1164-1874 1000-4007”表明这是一个包含大量POJ(Problem Online Judge)编程竞赛题目解决方案的资源集合。POJ是北京大学主办的一个在线编程平台,它提供了一系列的编程题目供参赛者...

    poj多道----acm----解题报告

    在二维平面上,这可以通过链表或数组来实现,将每个顶点作为链表或数组的一个节点,并保证首尾相连。 3. **判断点灯位置**:检查灯的位置是否在多边形内部。这可以通过射线交叉法实现,即从灯的位置向任意方向发射...

    POJ 分类题目

    ### POJ 分类题目知识点详解 #### 一、基本算法 **1. 枚举** - **定义**:枚举是一种通过尝试所有可能情况来解决问题的方法。 - **示例题目**: - poj1753 - poj2965 - **应用场景**:适用于问题规模较小或解决...

    POJ3373-Changing Digits【DFS+强剪枝】

    标题“POJ3373-Changing Digits【DFS+强剪枝】”涉及的是一个编程竞赛中的问题,这个问题在北大POJ(北京大学在线评测系统)平台上被提出。"Changing Digits"是一个算法挑战,而解决方案是通过深度优先搜索(DFS)...

    POJ3733-Changing Digits【DFS+强剪枝】

    【标题】"POJ3733-Changing Digits【DFS+强剪枝】"是一个来自北京大学在线评测系统POJ的编程题目,该题目主要涉及深度优先搜索(DFS)算法和强剪枝策略。在算法竞赛和编程挑战中,这类问题通常要求参赛者通过编写...

    POJ 1002 487-3279 测试数据 完整

    East Central North America 1999。50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50字50...

    POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】

    提供的代码文件"POJ3009-Curling 2.0【DFS+Vector+剪枝】.cpp"和"POJ3009-Curling 2.0【DFS+回溯+剪枝】.cpp"应该分别展示了如何在实际编程中应用这些技术,而"POJ3009-Curling 2.0.doc"则可能是解题报告,详细阐述...

    poj题目分类--acmer做题极有用资源

    《POJ题目分类——ACMer的必备资源》 在编程竞赛的世界里,北京大学的POJ(Problem Online Judge)平台是广大ACMer(编程竞赛爱好者)的重要实战基地。它提供了丰富的编程题目,涵盖各种算法和数据结构,对于提升...

Global site tag (gtag.js) - Google Analytics