題目:
有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種操作對應乙個二維陣列。這一題實質類似熄燈問題和畫家問題。其共通點在於 操作對環境的改變是無序的,每個操作都會影響到周圍的狀態。同時每...