poj 1166 The Clocks (暴搜)

The Clocks

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15944   Accepted: 6493

Description

|-------|    |-------|    |-------|
|       |    |       |    |   |   |
|---O   |    |---O   |    |   O   |
|       |    |       |    |       |
|-------|    |-------|    |-------|
    A            B            C    

|-------|    |-------|    |-------|
|       |    |       |    |       |
|   O   |    |   O   |    |   O   |
|   |   |    |   |   |    |   |   |
|-------|    |-------|    |-------|
    D            E            F    

|-------|    |-------|    |-------|
|       |    |       |    |       |
|   O   |    |   O---|    |   O   |
|   |   |    |       |    |   |   |
|-------|    |-------|    |-------|
    G            H            I
(Figure 1)

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)

Input

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.

Output

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.

Sample Input

3 3 0
2 2 2
2 1 2

Sample Output

4 5 8 9

分析:开始想通BFS,但是还要一个很大的数组记录路径,写半天没写出来。所以看别人的博客,copy了以下方法。主要是先进行哪种移动,后进行哪种移动,对结果没有影响,所以可以按照固定的顺序去搜索。

Java AC 代码

import java.util.Scanner;

public class TheClocks_1166 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a[] = new int[10];          //数组a是输入的数据
        for(int i = 1; i <= 9; i++) {
            a[i] = sc.nextInt();
        }
        int b[] = new int[10];
        int c[] = new int[10];
        for(b[1]=0;b[1]<=3;b[1]++)      //数组b用来存储9种移动方式,其中每种都可以使用0~3次,然后暴力搜索下去
        for(b[2]=0;b[2]<=3;b[2]++)      //共 4的9次方 种可能
        for(b[3]=0;b[3]<=3;b[3]++)      //因为AAB移动和ABA移动所造成的结果一样,故顺序可以固定
        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]=(a[1]+b[1]+b[2]+b[4])%4;  //数组c表示移动之后的钟表的状态
           c[2]=(a[2]+b[1]+b[2]+b[3]+b[5])%4; //加上移动方式对某一个钟表造成的影响
           c[3]=(a[3]+b[2]+b[3]+b[6])%4;
           c[4]=(a[4]+b[1]+b[4]+b[5]+b[7])%4;
           c[5]=(a[5]+b[1]+b[3]+b[5]+b[7]+b[9])%4;
           c[6]=(a[6]+b[3]+b[5]+b[6]+b[9])%4;
           c[7]=(a[7]+b[4]+b[7]+b[8])%4;
           c[8]=(a[8]+b[5]+b[7]+b[8]+b[9])%4;
           c[9]=(a[9]+b[6]+b[8]+b[9])%4;
           if(c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9]==0) //当都是0的时候,输出
           {
             for(int i=0;i<b[1];i++) System.out.print("1 ");
             for(int i=0;i<b[2];i++) System.out.print("2 ");
             for(int i=0;i<b[3];i++) System.out.print("3 ");
             for(int i=0;i<b[4];i++) System.out.print("4 ");
             for(int i=0;i<b[5];i++) System.out.print("5 ");
             for(int i=0;i<b[6];i++) System.out.print("6 ");
             for(int i=0;i<b[7];i++) System.out.print("7 ");
             for(int i=0;i<b[8];i++) System.out.print("8 ");
             for(int i=0;i<b[9];i++) System.out.print("9 ");
             System.out.print("\n");
             return;
           }
        }
    }
}
时间: 2024-12-21 03:14:52

poj 1166 The Clocks (暴搜)的相关文章

POJ 1166 The Clocks (爆搜 || 高斯消元)

题目链接 题意: 输入提供9个钟表的位置(钟表的位置只能是0点.3点.6点.9点,分别用0.1.2.3)表示.而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一.二.四.五个钟调正,如原来是0点,那么调正后为3点.问经过那些步骤可以导致9个钟的位置都在0点. 分析: 这个本来是一个高斯消元的题目,但是 听说周期4不是素数, 求解过程中不能进行取余.因为取余可能导致解集变大. 不过也有用高斯消元做的,下面是用高斯消元的分析 ” Discuss也有人讨论了,4不是质数

POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)

根据题意可构造出方程组,方程组的每个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = sum + 4*k,exgcd求出符合范围的x9,其他方程在代入已知的变量后格式亦如此. 第一发Gauss,蛮激动的. #include <algorithm> #include <iostream> #include <cstring> #include <cstd

poj 1166 The Clocks 记录路径的广搜

题意: 给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点). 分析: 明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点.2.queue<node>比queue<int>要多花1别的时间. //poj 1166 //sep9 #include <iostream> #include

Poj 1166 The Clocks(bfs)

题目链接:http://poj.org/problem?id=1166 思路分析:题目要求求出一个最短的操作序列来使所有的clock为0,所以使用bfs: <1>被搜索结点的父子关系的组织: 在bfs中,队列中存储着解答树中搜索过的结点,并且每个结点都可以使用它在队列中的位置作为其唯一的ID: 另外,使用另一个数组存储结点的父节点和从父节点到该节点的操作,同样的,使用结点在队列中的位置作为该节点的ID: 这种方法类似于并查集的方法,使用多个线性数组来模拟树的结构:这里模拟解答树中搜索过的结点构

POJ 1166 The Clocks 位运算与BFS

1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的状态所需要的最小操作数的操作方案: 2.输入输出:输入给出阵列初始状态,0,1,2,3分别表示0,3,6,9:要求输出最快方案的操作序列: 3.分析:IOI 1994的考题,BFS是比较容易想到的方法之一,关键是如何简洁的表示和改变BFS过程中的阵列状态:这里使用位运算的方法:具体如下: 首先一共9

poj 1543 Perfect Cubes (暴搜)

Perfect Cubes Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15302   Accepted: 7936 Description For hundreds of years Fermat's Last Theorem, which stated simply that for n > 2 there exist no integers a, b, c > 1 such that a^n = b^n + c

POJ 1166 The Clocks

高斯消元法第四个冠军,这个称号是非常令人兴奋~~ 题目大意: 给出9个钟表的状态.给出九种操作,问最少要操作几次能把全部的钟表调回12点. 解题思路: 对于9个钟表分别列方程,然后高斯消元就可以.因为这次左边的方程系数不是0就是1,所以不用找最大值~ 以下是代码: #include <set> #include <map> #include <queue> #include <math.h> #include <vector> #include

poj The Clocks(暴搜)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

[POJ 1204]Word Puzzles(Trie树暴搜)

Description Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client's percepti