Openjudge2814 撥鐘問題

2021-07-15 04:27:37 字數 2685 閱讀 9697

題目:

有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

input

9個整數,表示各時鐘指標的起始位置,相鄰兩個整數之間用單個空格隔開。其中,0=12點、1=3點、2=6點、3=9點。

output

輸出乙個最短的移動序列,使得9個時鐘的指標都指向12點。按照移動的序號從小到大輸出結果。相鄰兩個整數之間用單個空格隔開。

sample input

3 3 0

2 2 2

2 1 2

sample output

4 5 8 9

題意:

有9個鐘,每個鐘初始只能為0, 1, 2, 3, 其中0代表12點, 1代表3點, 2代表6點, 3代表9點。

有9個操作,每個操作將操作中對應序號的時鐘順時針旋轉90度,問題是找出乙個操作最少的組合,使得所有的時鐘都變為12點。

思路:

對於列表中1到9的某乙個操作,可以進行0次、1次、2次、3次,第4次就變回本身。那麼一共有4^9次方個組合。可以用9個for迴圈,也可以用dfs。

**:

#include 

#include

#include

#include

int arr[10];

int vis[10];

int sum[10];

int ans[10];

int minn=0x7fffffff;

using

namespace

std;

char mp[15][15] =;

void dfs(int depth)

}int asum = 0;

for(int i=1; i<=9; i++)

if(asumfor(int i=1; i<=9; i++)

else

ans[i]=0;

}minn = asum;

}return;

}for(int i=0; i<4; i++)

vis[depth]=(i==0)?0:1;

sum[depth]=i;

dfs(depth+1);

for(int j=0; j

vis[depth]=0;

sum[depth]=0;

}}int main()

dfs(1);

int tag=0;

for(int i=1; i<=9; i++)

else

cout

<

0;}

題意又理解偏了,(汗!--)輸入只可能為0, 1, 2, 3,我以為還有其他的輸入。。於是我將0, 1, 2 , 3轉化為所對應的實際的點,按理說這樣模擬也可以過,但是開始忘記將minn的值進行更新,改了之後還是wa,卡了乙個下午,最後問了一下同學,發現又將題意理解錯了,於是我按輸入只有0, 1, 2, 3來寫,過了。我倒回頭看原來模擬的寫法,漏了指令使用次數為0時的一次模運算!!!

下面貼最開始模擬現實時鐘的寫法(看錯題目的產物):

#include 

#include

#include

#include

int arr[10];

int vis[10];

int sum[10];

int ans[10];

int minn=0x7fffffff;

using namespace std;

char mp[15][15] =;

void dfs(int depth)

}//for(int i=1; i<=9; i++)

if(asumfor(int i=1; i<=9; i++)

else

ans[i]=0;

}minn = asum;

}return;

}for(int i=0; i<4; i++)

vis[depth]=(i==0)?0:1;

sum[depth]=i;

dfs(depth+1);

for(int j=0; j64] = (arr[mp[depth][j]-64]+12

*i-3

*i)%12;

}vis[depth]=0;

sum[depth]=0;

}}int main()

dfs(1);

int tag=0;

for(int i=1; i<=9; i++)

else cout<

0;}

寫了這題收穫很多!!

OpenJ Bailian 2814 撥鐘問題

總時間限制 1000ms 記憶體限制 65536kb 描述有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種不同的移動。如下表所示,每個移動會將若干個時鐘的指標沿順時...

poj2814 撥鐘問題 C語言 列舉演算法

include include 首先,我們考慮用長度為9的陣列表示表盤的狀態以及調表的操作,終止的條件是表盤狀態陣列所有元素模4為0 如果一種操作使用超過4次,那麼相當於沒有操作,所以運算元組需要多出一位記錄造作使用的次數,乙個操作最多使用3次 特別是我們注意到這個題沒有問操作的順序,所以操作的前後...

列舉 撥鐘問題

演算法思路 假設時鐘指標位置對應的值為clock time,那麼順時針旋轉90 就是clock time clock time 1 4 這一組時針就用乙個陣列表示。9種操作對應乙個二維陣列。這一題實質類似熄燈問題和畫家問題。其共通點在於 操作對環境的改變是無序的,每個操作都會影響到周圍的狀態。同時每...