POJ-1816 撥鍾問題
題目
來源
限制
總時間限制: 1000ms 記憶體限制: 65536kB
描述
有9個時鐘,排成一個3*3的矩陣。
現在需要用最少的移動,將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次(5次及以上沒有意義),窮舉可得
原始碼
#include <stdio.h>
int clock[9] = {0};
int n1 = 0;
int n2 = 0;
int n3 = 0;
int n4 = 0;
int n5 = 0;
int n6 = 0;
int n7 = 0;
int n8 = 0;
int n9 = 0;
int main()
{
int i = 0;
//輸入鐘的初始狀態
for( i = 0; i < 9; i++ )
{
scanf("%d", &clock[i]);
}
for( n1 = 0; n1 < 4; n1++ )
{
for( n2 = 0; n2 < 4 ; n2++ )
{
for( n3 = 0; n3 < 4; n3++ )
{
for( n4 = 0; n4 < 4; n4++ )
{
for( n5 = 0; n5 < 4; n5++ )
{
for( n6 = 0; n6 < 4; n6++ )
{
for( n7 = 0; n7 < 4; n7++ )
{
for( n8 = 0; n8 < 4; n8++ )
{
for( n9 = 0; n9 < 4; n9++ )
{
if( isOK( clock ) )
{
for( i=0;i<n1;i++ ) printf("1 ");
for( i=0;i<n2;i++ ) printf("2 ");
for( i=0;i<n3;i++ ) printf("3 ");
for( i=0;i<n4;i++ ) printf("4 ");
for( i=0;i<n5;i++ ) printf("5 ");
for( i=0;i<n6;i++ ) printf("6 ");
for( i=0;i<n7;i++ ) printf("7 ");
for( i=0;i<n8;i++ ) printf("8 ");
for( i=0;i<n9;i++ ) printf("9 ");
}
c9();
}
c8();
}
c7();
}
c6();
}
c5();
}
c4();
}
c3();
}
c2();
}
c1();
}
return 0;
}
int isOK( int c[] )
{
int r = 1;
int i = 0;
for( i = 0; i < 9; i++ )
{
if( c[i] != 0 )
r = 0;
}
return r;
}
void c1()
{
clock[0] = (clock[0]+1)%4;
clock[1] = (clock[1]+1)%4;
clock[3] = (clock[3]+1)%4;
clock[4] = (clock[4]+1)%4;
}
void c2()
{
clock[0] = (clock[0]+1)%4;
clock[1] = (clock[1]+1)%4;
clock[2] = (clock[2]+1)%4;
}
void c3()
{
clock[1] = (clock[1]+1)%4;
clock[2] = (clock[2]+1)%4;
clock[4] = (clock[4]+1)%4;
clock[5] = (clock[5]+1)%4;
}
void c4()
{
clock[0] = (clock[0]+1)%4;
clock[6] = (clock[6]+1)%4;
clock[3] = (clock[3]+1)%4;
}
void c5()
{
clock[1] = (clock[1]+1)%4;
clock[3] = (clock[3]+1)%4;
clock[4] = (clock[4]+1)%4;
clock[5] = (clock[5]+1)%4;
clock[7] = (clock[7]+1)%4;
}
void c6()
{
clock[2] = (clock[2]+1)%4;
clock[5] = (clock[5]+1)%4;
clock[8] = (clock[8]+1)%4;
}
void c7()
{
clock[3] = (clock[3]+1)%4;
clock[4] = (clock[4]+1)%4;
clock[6] = (clock[6]+1)%4;
clock[7] = (clock[7]+1)%4;
}
void c8()
{
clock[6] = (clock[6]+1)%4;
clock[7] = (clock[7]+1)%4;
clock[8] = (clock[8]+1)%4;
}
void c9()
{
clock[4] = (clock[4]+1)%4;
clock[5] = (clock[5]+1)%4;
clock[7] = (clock[7]+1)%4;
clock[8] = (clock[8]+1)%4;
}
BUG
這段程式碼只是恰巧通過了,但是如果產生了多種可能答案,並且正確答案在後,那就不能正確輸出了
相關推薦
POJ-1816 撥鍾問題
題目 來源 限制 總時間限制: 1000ms 記憶體限制: 65536kB 描述 有9個時鐘,排成一個3*3的矩陣。 現在需要用最少的移動,將9個時鐘的指標都撥到12點的位置。共允許有9種不同的移動。如下表所示,每個移動會將若干個時鐘
poj 1816 Wild Words
name pattern stream cee and trie order ber clas Description A word is a string of lowercases. A word pattern is a string of lowercases,
POJ 1816 - Wild Words - [字典樹+DFS]
sam sim sum truct hand last empty 字符串 const 題目鏈接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Tim
第一週測驗(列舉) 特殊密碼鎖(二進位制)+撥鍾問題
001:特殊密碼鎖 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。 然而讓人頭疼的是,當你按一個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它
【貪心列舉】撥鍾問題
問題描述 有9個時鐘,排成一個3*3的矩陣。現在需要用最少的移動,將9個時鐘的指標都撥到12點的位置。共允許有9種不同的移動。如右表所示,每個移動會將若干個時鐘的指標沿順時針方向撥動90度。 移動 影響的時鐘 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BD
撥鍾問題 OpenJ_Bailian
這是一道和畫家問題,熄燈問題極為相似的題目。 共同特性:操作對環境的改變是無序的,每個操作都會影響到周圍的狀態。 同時每一種操作都有周期性限制,也即最多需要幾次操作,多於這個次數產生相等效果的迴圈。 這類題也有一個共同的解決思路:確定一個小的列舉方案,這個列舉方案產
? 列舉 程式設計題#2:撥鍾問題(Coursera 程式設計與演算法 專項課程4;函式memcpy的用法,switch case break 語句!)
程式設計題#2:撥鍾問題 來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。) 注意: 總時間限制: 1000ms 記憶體限制: 65536kB 描述 有9個時鐘,排成一個3*3的矩陣。
POJ 3518 Prime Gap(素數)
for org 篩選法求素數 lan article sizeof tar eof rim POJ 3518 Prime Gap(素數) http://poj.org/problem?id=3518 題意: 給你一個數。假設該數是素數就輸出0. 否則輸出比
POJ 2586 Y2K Accounting Bug(枚舉大水題)
lin uri ssd 數據丟失 span com reported cpp rem Y2K Accounting Bug Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1067
poj 1182 (帶權並查集)
ios int 查找 食物 spa script ble 距離 輸出 食物鏈 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71361 Accepted: 21131 Des
poj 2559 Largest Rectangle in a Histogram 棧
hist func opc txt class sse typedef ++ limit // poj 2559 Largest Rectangle in a Histogram 棧 // // n個矩形排在一塊,不同的高度,讓你求最大的矩形的面積(矩形緊挨在一起)
POJ 3461 kmp
desc href i++ -a spl ffi mem table art Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40168 Acce
POJ Knight Moves 2243 x
rate tput ble esc 當前 malle center namespace string Knight Moves Time Limit: 1000MS Memory Limit: 65536K
poj:1850 Code(組合數學?數位dp!)
urn font log strlen adc i++ 分享 依次 one 題目大意:字符的字典序依次遞增才是合法的字符串,將字符串依次標號如:a-1 b-2 ... z-26 ab-27 bc-52。 為什麽題解都是組合數學的...我覺得數位dp很好寫啊(逃
POJ 2533 Longest Ordered Subsequence DP
tro wid element ogr cst ++ max integer article Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submi
POJ 2488:A Knight's Journey
graph for erp 技術分享 rpe one star void get A Knight‘s Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29241
BZOJ 2288 【POJ Challenge】生日禮物(貪心+優先隊列)
ace urn ons target challenge pri 最大 font return 【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2288 【題目大意】 給出一列數,求最多取m段
POJ 1849 Two(遍歷樹)
bold cost spa align div col sizeof 最小 turn POJ 1849 Two(遍歷樹) http://poj.org/problem?id=1849 題意: 有一顆n個結點的帶權的無向樹, 在s結點放兩個機器人,
POJ 2486 Apple Tree
reac steps int sca have font eof bmi part
Poj - 3279 Fliptile
black 枚舉 pri 返回 flip algo with ips cnblogs Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10018 Accepted: