1. 程式人生 > >POJ-1816 撥鍾問題

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&#39;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: