枚举--拨钟问题

参考http://blog.sina.com.cn/s/blog_b1e4dca501013z88.html思路,给出非9重循环的程序实现:

#include <iostream>
#include <stdio.h>

using namespace std;

// clock的位置
int A[9];

// 思路 :首先确定“局部” :前三个操作。
// 然后查看后续操作能否满足要求。

bool isClock(int* a){

  for (int i=0;i<9;i++) {

    if(a[i]!=0)
      return false;
  }
  return true;
}

bool getNextCond(int * container)
{
  int i = 0;
  container[0]++;

  while (container[i] >= 4)
  {
    container[i] = 0;
    i++;
    if (i >= 3)
      return false;
    container[i]++;
  }

  return true;
}

bool getCurOper(int* container,const int * src, int& tmp)
{
  int tmpA = (src[0] + container[0] + container[1])%4;
  int tmpB = (src[1] + container[0] + container[1] + container[2])%4;
  int tmpC = (src[2] + container[1] + container[2])%4;

  container[3] = (4-tmpA)%4;
  container[4] = (4-tmpB)%4;
  container[5] = (4-tmpC)%4;

  int tmpD = (src[3] + container[0] + container[3] + container[4])%4;
  int tmpF = (src[5] + container[2] + container[4] + container[5])%4;

  container[6] = (4-tmpD)%4;
  container[8] = (4-tmpF)%4;

  //检查E的状态及GHI
  int E = (src[4] + container[0] + container[2] + container[4] + container[6] + container[8])%4;
  if (E != 0)
    return false;

  int tmpG = (src[6] + container[3] + container[6])%4;
  int tmpH = (src[7] + container[4] + container[6] + container[8])%4;
  int tmpI = (src[8] + container[5] + container[8])%4;

  if (tmpG != tmpH || tmpH != tmpI)
    return false;

  container[7] = (4-tmpI)%4;
  return true;
}

void getMinOper(int * container, int * src, int& min)
{
  int tmpContainer[10] = {0};
  int tmp = 0;

  do {
    if (getCurOper(tmpContainer, src, tmp))  {
      if (tmp < min)  {
        min = tmp;
        for (int i=0;i<9;++i)
          container[i] = tmpContainer[i];
      }
    }
  }while(getNextCond(tmpContainer));

}

int main(){
  int min = 99999;
  int contain[9];
  for (int i=0;i<9;i++) {
    cin>>A[i];
  }
  if (isClock(A)) {
    cout<<"0"<<endl;
    return 0;
  }

  getMinOper(contain, A, min);
  for (int i=0;i<9;++i) {
    while (contain[i]--) {
      printf("%d ",i+1);
    }
  }

  return 0;
}

时间: 2024-10-10 16:49:27

枚举--拨钟问题的相关文章

拨钟问题

传送门:http://bailian.openjudge.cn/practice/2814?lang=en_US 拨钟问题,画家问题,熄灯问题,这三个题有共同的特点: 1.每个开关或者移动的步数是有次数限制的.拨钟问题移动次数最多为4,因为移动4次跟不移m动一样,画家问题和熄灯问题次数为2,因为开关按两次跟没按一样. 2.移动顺序或者按开关的顺序不重要.都是为了达到目标状态,先按哪个开关和后按哪个开关不影响最终结果. 3.每次按开关或者移动或影响周围环境. 下面谈谈拨钟问题: 一共有9种移动,每

002:拨钟问题

总时间限制:  1000ms 内存限制:  65536kB 描述 有9个时钟,排成一个3*3的矩阵. |-------| |-------| |-------|| | | | | | ||---O | |---O | | O || | | | | ||-------| |-------| |-------| A B C |-------| |-------| |-------|| | | | | || O | | O | | O || | | | | | | | ||-------| |----

ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题)

POJ1681-画家问题 枚举的经典例题,枚举第一行即可,其余行唯一. 1 //画家问题,y表示黄色,w表示白色,怎样让墙上所有方格为y,操作类似熄灯问题poj1222 2 //memory 136K Time: 297 Ms 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 #define INF

7.18练习 DFS+递归

A 百练2811 熄灯问题 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行.每个按钮的位置上有一盏灯.当按下一个按钮后,该按钮以及周围位置(上边.下边.左边.右边)的灯都会改变一次.即,如果灯原来是点亮的,就会被熄灭:如果灯原来是熄灭的,则会被点亮.在矩阵角上的按钮改变3盏灯的状态:在矩阵边上的按钮改变4盏灯的状态:其他的按钮改变5盏灯的状态. 在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变.对矩阵中的每

【算法】搞定[机试]算法刷题 全文超过80页pdf

目录 算法专题 一.树和图 1. 二叉树构造和遍历 2. 朋友圈 - 并查集 3. 公共朋友 - 非朋友圈 4. 哈夫曼树 5. 其他二叉树性质相关计算 6. 图的连通分量 7. 最小生成树 8. 单源最短路径 - dijkstra 二.枚举搜索 1. 按钮开关问题 2. 多层枚举问题 三.递归搜索 1. 简单递归 2. 递增排列组合类 3. 全排列问题 4. 草丛问题 5. 迷宫问题 6. 广度优先搜索的剪枝 7. 总操作步数固定枚举问题 四.数学问题 1. 高精度计算 2. 素数和质因子分解

[Effective JavaScript 笔记]第48条:避免在枚举期间修改对象

注册列表示例 一个社交网络有一组成员,每个成员有一个存储其朋友信息的注册列表. function Member(name){ this.name=name; this.friends=[]; } var a=new Member('钟二'), b=new Member('张三'), c=new Member('赵四'), d=new Member('王五'), e=new Member('阮六'), f=new Member('耿七'); a.friends.push(b); b.friends

USB枚举过程【转】

转自:http://blog.csdn.net/myarrow/article/details/8270029 1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序.调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了. USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告.在系统启动时,主机轮询它的

Python 的枚举 Enum

枚举是常用的功能,看看Python的枚举. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) 枚举的定义 首先,定义枚举要导入enum模块. 枚举定义用class关键字,继承Enum类. 注意: 定义枚举时,成员名称不允许重复 默认情况下,不同的成员值允许相同.但是两个相同值的成员,第二个

二维背包(钟神想要的)(不是DP)

[问题描述] 背包是个好东西,希望我也有.给你一个二维的背包,它的体积是? × ?.现在你有一些大小为1× 2和1×3的物品,每个物品有自己的价值.你希望往背包里面装一些物品,使得它们的价值和最大,问最大的价值和是多少. [输入格式] 第一行一个整数?代表该测试点的数据组数.对于每组数据,第一行有四个整数?,?,? 1 ,? 2 ,其中? 1 ,? 2 分别代表大小为1× 2和大小为1 × 3的物品个数.1 × 2 接下来一行有? 2 个数代表每个1 × 3物品的价值. [输出格式] 对于每组询