`

poj 1166(枚举)

poj 
阅读更多
总时间限制:
1000ms
内存限制:
65536kB
描述
There are nine clocks in a 3*3 array (figure 1). The goal is to return all the dials to 12 o'clock with as few moves as possible. There are nine different allowed ways to turn the dials on the clocks. Each such way is called a move. Select for each move a number 1 to 9. That number will turn the dials 90' (degrees) clockwise on those clocks which are affected according to figure 2 below.
Move   Affected clocks
 
 1         ABDE
 2         ABC
 3         BCEF
 4         ADG
 5         BDEFH
 6         CFI
 7         DEGH
 8         GHI
 9         EFHI    
   (Figure 2)
输入
Your program is to read from standard input. Nine numbers give the start positions of the dials. 0=12 o'clock, 1=3 o'clock, 2=6 o'clock, 3=9 o'clock.
输出
Your program is to write to standard output. Output a shortest sorted sequence of moves (numbers), which returns all the dials to 12 o'clock. You are convinced that the answer is unique.
样例输入
3 3 0
2 2 2
2 1 2
样例输出
4 5 8 9

翻译:
问题描述:有9个时钟,排成一个33的矩阵。现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如右表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
输入:从标准输入设备读入9个整数,表示各时钟指针的起始位置。0=12点、1=3点、2=6点、3=9点。
输出:输出一个移动序列,使得9个时钟的指针都指向12点。按照移动的序号由小到大,输出结果.
解题思路:
这题既然选择用枚举来做,首先我们要想好先要枚举什么,观题不难理解枚举9种移动的方法可以很好的
表示出来,另外,每种方法只能用三次应为第四次会回到起始点。
#include<iostream>
#include<string>
using namespace std ;
int a[10] ;//接收输入数据
int b[10] ;//接收选择方法的次数
int c[10] ;//存储结果
int tempsum ,sum=28;
string s  ;
int main()
{
int i ;
for(i=1;i<10;i++)
    cin>>a[i] ;

    for(b[1]=0;b[1]<=3;b[1]++)
    for(b[2]=0;b[2]<=3;b[2]++)
    for(b[3]=0;b[3]<=3;b[3]++)
    for(b[4]=0;b[4]<=3;b[4]++)
    for(b[5]=0;b[5]<=3;b[5]++)
    for(b[6]=0;b[6]<=3;b[6]++)
    for(b[7]=0;b[7]<=3;b[7]++)
    for(b[8]=0;b[8]<=3;b[8]++)
    for(b[9]=0;b[9]<=3;b[9]++)
   {
    c[1] = (b[1] + b[2] + b[4] + a[1])%4 ;
    c[2] = (b[1] + b[2] + b[3] + b[5]+a[2])%4 ;
    c[3] = (b[2] + b[3] + b[6]+a[3])%4 ;
    c[4] = (b[1] + b[4] + b[5] + b[7]+a[4])%4 ;
    c[5] = (b[1] + b[3] + b[5] + b[7] + b[9]+a[5])%4 ;
    c[6] = (b[3] + b[5] + b[6] + b[9]+a[6])%4 ;
    c[7] = (b[4] + b[7] + b[8]+a[7])%4 ;
    c[8] = (b[5] + b[7] + b[8] + b[9]+a[8])%4 ;
    c[9] = (b[6] + b[8] + b[9]+a[9])%4 ;
    if((c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9])==0)
    {
     tempsum = b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8]+b[9] ;
     if(tempsum<sum)
     {
         sum = tempsum ;
         s = "" ;
       //  cout<<sum<<endl  ;
         for(i=1;i<=b[1];i++)
            s = s + "1 " ;
         for(i=1;i<=b[2];i++)
            s = s + "2 " ;
         for(i=1;i<=b[3];i++)
            s = s + "3 " ;
         for(i=1;i<=b[4];i++)
            s = s + "4 " ;
         for(i=1;i<=b[5];i++)
            s = s + "5 " ;
         for(i=1;i<=b[6];i++)
            s = s + "6 " ;
         for(i=1;i<=b[7];i++)
            s = s + "7 " ;
         for(i=1;i<=b[8];i++)
            s = s + "8 " ;
         for(i=1;i<=b[9];i++)
            s = s + "9 " ;

     }
    }
   }

  cout<<s<<endl ;

    return 0 ;
}
 
分享到:
评论

相关推荐

    poj1753枚举

    该题记录了本人研究该题的记录,有些是心得,希望能给大家帮助。

    POJ算法题目分类

    * 枚举:枚举是指通过遍历所有可能的情况来解决问题的方法,如 poj1753、poj2965。 * 贪心:贪心算法是指通过选择当前最优的解来解决问题的方法,如 poj1328、poj2109、poj2586。 * 递归和分治法:递归和分治法是指...

    poj题目分类

    * 枚举法:通过枚举所有可能的解来解决问题,例如 poj1753、poj2965。 * 贪心算法:通过选择当前最优的解决方案来解决问题,例如 poj1328、poj2109、poj2586。 * 递归和分治法:通过将问题拆分成小问题来解决,...

    poj训练计划.doc

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

    poj各种分类

    例如,题目poj1753和poj2965可以采用枚举策略解决,但这种方法效率较低,适用于小规模数据或当其他算法难以实现时。 #### 贪心 贪心算法是一种局部最优解策略,每次选择当前状态下看似最优的选择,以期望最终达到...

    POJ1753-Flip Game

    《翻转游戏——POJ1753解题分析与实现》 在计算机科学与编程领域,解决问题的能力是至关重要的。北京大学在线编程平台POJ(Problemset Online Judge)中的题目POJ1753——“Flip Game”,就是一个很好的锻炼逻辑...

    西北工业大学poj

    4. "第三季枚举":枚举算法通常用于遍历所有可能的情况来求解问题,这在解决一些组合优化或图论问题时非常常见。 5. "第二季循环":循环是程序控制流的基础,这部分可能包括for、while等循环结构的运用,以及复杂的...

    POJ题目简单分类(ACM)

    - **枚举**:通过尝试所有可能的情况来解决问题,例如poj1753和poj2965。 - **贪心**:每次选择当前最优解,如poj1328、poj2109和poj2586。 - **递归与分治**:将大问题分解为小问题解决,如快速排序、归并排序等...

    acm poj300题分层训练

    如poj1753、poj2965用于枚举训练,poj1328、poj2109、poj2586是贪心策略的实例,poj2506和poj3295涉及分治法,poj1068、poj2632等则用于模拟训练。 2. **图算法**:包括图的深度优先遍历、广度优先遍历、最短路径...

    poj算法题目实现.zip_algorithm_arrangement4hv_conditionyis_poj problems

    这可能需要用到贪心算法(Greedy Algorithm)或者深度优先生成树(Depth First Search Tree)来枚举所有可能的操作序列,找到满足条件的最少操作数。 以上五个题目涵盖了图论、动态规划、回溯法、数论和贪心算法等...

    史上最全poj题目分类

    史上最全poj题目分类 本文将对史上最全poj题目分类进行详细的知识点介绍,涵盖了基本算法、基本数据结构、高级数据结构、数学等方面的知识点。 基本算法 贪心算法是一种常用的算法思想,贪心算法的核心思想是每次...

    POJ1054讨厌的青蛙

    POJ1054讨厌的青蛙,利用枚举算法解题,值得一做。

    poj编程指导

    《POJ编程指导》是一本介绍如何使用POJ(北大在线评判系统)进行ACM算法学习和实践的书籍。ACM竞赛是国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC)的前身,它为计算机编程爱好...

    ACM 比赛 POJ的训练计划,,,非常不错,关键在于坚持

    在初期阶段,选手需要掌握基本算法,如枚举、贪心、递归和分治法等。然后,需要学习图算法,如深度优先遍历、广度优先遍历、最短路径算法和最小生成树算法等。最后,需要学习数据结构,如串、排序、堆和哈希表等。 ...

    POJ 分类题目

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

    poj 百练 题目分类

    poj 百练 题目分类是指在 POJ(Peking University Online Judge)平台上面的编程题目的分类,这些题目涵盖了多种编程领域,包括枚举、递归、模拟、数制转换、高精度计算、简单计算、字符串处理和日期时间处理等。...

    POJ2965-The Pilots Brothers' refrigerator

    在提供的代码文件中,"POJ2965-The Pilots Brothers' refrigerator(DFS+enum).cpp" 应该是使用DFS和枚举实现的解决方案,而 "POJ2965-The Pilots Brothers' refrigerator(DFS+Bit).cpp" 是使用DFS和位运算的版本。...

    poj图论题目汇总

    在本篇文章中,我们将深入探讨POJ平台上的一系列经典图论问题,并根据提供的部分内容,总结出每个题目背后所涉及的核心算法和技术点。这些题目不仅考验了参赛者的逻辑思维能力,同时也对数据结构和算法的掌握提出了...

    PKU POJ 1162 Building with Blocks解题报告

    ### PKU POJ 1162 Building with Blocks 解题报告 #### 题目概述 本题名为“Building with Blocks”,属于经典的积木搭建问题。题目要求利用一定数量的基本单位积木,搭建出特定的三维形状。积木的种类不超过12种,...

Global site tag (gtag.js) - Google Analytics