1. 程式人生 > >Vijos——T 1016 北京2008的掛鐘 || 洛谷—— P1213 時鐘

Vijos——T 1016 北京2008的掛鐘 || 洛谷—— P1213 時鐘

單獨 說明 div 安排 表示 include 影響 usaco 判斷

https://www.luogu.org/problem/show?pid=1213

題目描述

考慮將如此安排在一個 3 x 3 行列中的九個時鐘:

技術分享

目標要找一個最小的移動順序將所有的指針指向12點。下面原表格列出了9種不同的旋轉指針的方法,每一種方法都叫一次移動。選擇1到9號移動方法,將會使在表格中對應的時鐘的指針順時針旋轉90度。

移動方法 受影響的時鐘

1 ABDE

2 ABC

3 BCEF

4 ADG

5 BDEFH

6 CFI

7 DEGH

8 GHI

9 EFHI

Example

技術分享

[但這可能不是正確的方法,請看下面]

輸入輸出格式

輸入格式:

第1-3行: 三個空格分開的數字,每個數字表示一個時鐘的初始時間,3,6,9,12。數字的含意和上面第一個例子一樣。

輸出格式:

單獨的一行包括一個用空格分開的將所有指針指向12:00的最短移動順序的列表。

如果有多種方案,輸出那種使其連接起來數字最小的方案。(舉例來說5 2 4 6 < 9 3 1 1)。

輸入輸出樣例

輸入樣例#1:
9 9 12
6 6 6
6 3 6 
輸出樣例#1:
4 5 8 9

說明

題目翻譯來自NOCOW。

USACO Training Section 1.4

搜索每次移動方案的使用次數、每次用原始時鐘判斷一次。、

每次使用移動方法多余3時就轉一圈沒意義了。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 int op[9][9]={{1,1,0,1,1,0,0,0,0},
 6               {1,1,1,0,0,0,0,0,0},
 7               {0,1,1,0,1,1,0,0,0},
 8               {1,0,0,1,0,0,1,0,0},
 9               {0,1,0,1,1,1,0,1,0},
10               {0
,0,1,0,0,1,0,0,1}, 11 {0,0,0,1,1,0,1,1,0}, 12 {0,0,0,0,0,0,1,1,1}, 13 {0,0,0,0,1,1,0,1,1}}; 14 int tmp[10],tim[10],cnt[10]; 15 16 inline void read(int &x) 17 { 18 x=0; register char ch=getchar(); 19 for(;ch>9||ch<0;) ch=getchar(); 20 for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0; 21 } 22 23 bool judge(int *a) 24 { 25 for(int i=0; i<9; ++i) 26 if(a[i]) return 0; 27 return true; 28 } 29 30 void DFS(int num) 31 { 32 memcpy(&tmp,&tim,sizeof(tim)); 33 for(int i=0; i<9; ++i) 34 for(int j=0; j<9; ++j) 35 tmp[i]=(tmp[i]+op[j][i]*cnt[j])%4; 36 if(judge(tmp)) 37 { 38 for(int i=0; i<9; ++i) 39 for(int j=0; j<cnt[i]; ++j) 40 printf("%d ",i+1); 41 std::exit(0) ; 42 } 43 if(num==9) return ; 44 for(int i=0; i<4; ++i) 45 cnt[num]=i,DFS(num+1); 46 } 47 48 int Aptal() 49 { 50 for(int i=0; i<9; ++i) 51 read(tim[i]),tim[i]/=3,tim[i]%=4; 52 DFS(0); 53 return 0; 54 } 55 56 int Hope=Aptal(); 57 int main(){;}

Vijos——T 1016 北京2008的掛鐘 || 洛谷—— P1213 時鐘