算法实践:拨钟问题

拨钟问题

描述

有9个时钟,排成一个3*3的矩阵。

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

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

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

现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。

移动    影响的时钟
 
 1         ABDE
 2         ABC
 3         BCEF
 4         ADG
 5         BDEFH
 6         CFI
 7         DEGH
 8         GHI
 9         EFHI    

输入

9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。

输出

输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。

样例

3 3 0 
2 2 2 
2 1 2 
4 5 8 9 

难度

高,枚举

解法

每个钟都有4种被拨的情况,用9重循环枚举每个钟的情况,一共有4**9种情况

代码

package com.company;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
	// write your code here
        Scanner input = new Scanner(System.in);
        int[] clock = new int[10];
        int[] tick = new int[10];
        int sum;
        for(int i =1;i<=9;i++)
            clock[i] = input.nextInt();
        for(tick[1]=0;tick[1]<4;tick[1]++)
            for(tick[2]=0;tick[2]<4;tick[2]++)
                for(tick[3]=0;tick[3]<4;tick[3]++)
                    for(tick[4]=0;tick[4]<4;tick[4]++)
                        for(tick[5]=0;tick[5]<4;tick[5]++)
                            for(tick[6]=0;tick[6]<4;tick[6]++)
                                for(tick[7]=0;tick[7]<4;tick[7]++)
                                    for(tick[8]=0;tick[8]<4;tick[8]++)
                                        for(tick[9]=0;tick[9]<4;tick[9]++) {
                                            sum = 0;
                                            sum += (clock[1] + tick[1] + tick[2] + tick[4]) % 4;
                                            sum += (clock[2] + tick[1] + tick[2] + tick[3] + tick[5]) % 4;
                                            sum += (clock[3] + tick[2] + tick[3] + tick[6]) % 4;
                                            sum += (clock[4] + tick[1] + tick[4] + tick[5] + tick[7]) % 4;
                                            sum += (clock[5] + tick[1] + tick[3] + tick[5] + tick[7] + tick[9]) % 4;
                                            sum += (clock[6] + tick[3] + tick[5] + tick[9]) % 4;
                                            sum += (clock[7] + tick[4] + tick[7] + tick[8]) % 4;
                                            sum += (clock[8] + tick[5] + tick[7] + tick[8] + tick[9]) % 4;
                                            sum += (clock[9] + tick[6] + tick[8] + tick[9]) % 4;
                                            if(sum==0)
                                            {
                                                for(int j=1;j<=9;j++)
                                                    while(tick[j]-- >0)
                                                        System.out.printf("%d ", j);
                                                return ;
                                            }
                                        }
    }
}

发布了129 篇原创文章 · 获赞 148 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/matafeiyanll/article/details/104984315
今日推荐