題目:撥鐘問題
1166:撥鐘問題
描述
有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 ABDE2 ABC3 BCEF4 ADG5 BDEFH6 CFI7 DEGH8 GHI9 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
思路:枚舉,也就是暴力,注意一個方法最多使用三次。
#include <string.h>
#include <stdio.h>
#define FOR(x) for(x=0;x<=3;x++)
int main()
{int i,a[10],b[10],c[10];for(i=1;i<=9;i++)scanf("%d",&a[i]);FOR(b[1])FOR(b[2])FOR(b[3])FOR(b[4])FOR(b[5])FOR(b[6])FOR(b[7])FOR(b[8])FOR(b[9]){c[1]=(a[1]+b[1]+b[2]+b[4])%4;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){for(i=0;i<b[1];i++) printf("1 ");for(i=0;i<b[2];i++) printf("2 ");for(i=0;i<b[3];i++) printf("3 ");for(i=0;i<b[4];i++) printf("4 ");for(i=0;i<b[5];i++) printf("5 ");for(i=0;i<b[6];i++) printf("6 ");for(i=0;i<b[7];i++) printf("7 ");for(i=0;i<b[8];i++) printf("8 ");for(i=0;i<b[9];i++) printf("9 ");printf("\n");return(0);}}
}