北京2008的掛鐘

2021-09-21 18:07:43 字數 1496 閱讀 6626

題目描述:

在2008北京奧運會雄偉的主會場的牆上,掛著如上圖所示的3*3的九個掛鐘(一開始指標即時針指向的位置請根據輸入資料調整)。然而此次奧運會給與了大家乙個機會,去用最少的移動操作改變上面的掛鐘的時間全部為12點正(我們只考慮時針)。然而每一次操作並不是任意的,我們必須按照下面給出的列表對於掛鐘進行改變。每一次操作我們給而且必須給指定的操作掛鐘進行,每乙個掛鐘順時針轉動90度。列表如下:

操作 指定的操作掛鐘

1 abde

2 abc

3 bcef

4 adg

5 bdefh

6 cfi

7 degh

8 ghi

9 efhi

輸入你的程式按照標準的3*3格式讀入,一共9個0-3的數。0代表12點,1代表3點,2代表6點,3代表9點。

輸出你的程式需要寫出標準的輸出。輸出乙個最短的能夠使所有掛鐘指向12點的移動操作序列,中間以空格隔開,最後有空格,加回車。這一條最短操作需要是所有最短操作中最小的,也就是說選擇最小的第乙個運算元,如果第乙個運算元相等,那麼選擇最小的第二個運算元……以此類推。值得肯定的是,這一條操作序列是唯一的。

樣例輸入:

3 3 0

2 2 2

2 1 2

樣例輸出:

4 6 8 9
思路:用乙個dfs直接暴力搜尋即可,用3個陣列,分別記錄輸入的資料,操作時拷貝輸入資料的陣列以及每種操作各使用的次數的陣列。

**:

#includeusing namespace std;

int dir[9][9] = ,,,

,,,,

,};//每一行表示1,2,3,4,5,6,7,8,9種操作下a,b,c,d,e,f,g,h,i各個時鐘的操作方式

int num[9], start[9], linshi[9];//num記錄每種操作各用了幾次,start用於開始輸入資料,linshi是start的副本

bool judge(int h[9])//判斷是否9個時鐘全為0(0即12)的函式

} return 1;

}void dfs(int kind)

//每次dfs開始的時候都要初始化,因為後面的2個for迴圈會全部跑一遍

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

if (judge(linshi))//如果全部為0了,輸出操作過程

}return;

} if (kind == 9)//沒有第9種操作(運算元從0開始計算)

for (int i = 0; i < 4; i++)//因為同一種操作操作4次等於沒有操作,所以for迴圈裡只有到3 }

int main()

dfs(0);

return 0;

}

Vijos P1016北京2008的掛鐘

題意 開9維的bfs,看了別人的優化方法是 用到了優先佇列,因為求的最短的操作路徑,所以用當前的步數作為優先佇列的條件,步數少的優先 include include include include include using namespace std int flag 4 4 4 4 4 4 4 ...

vijosP1016 北京2008的掛鐘

vijosp1016 北京2008的掛鐘 思路 dfs。對操作搜尋更加優秀,所以採用搜尋每乙個操作的使用次數,因為運算元為4則相當於沒有操作,所以列舉上限為3。1 include2 include3 include4 using namespace std 56 int op 9 9 7 8 9 1...

北京2008奧運會門票到手

今天去中國銀行拿到了北京2008奧運會門票,是2008年8月9日在北京奧林匹克籃球館舉行的一場女子籃球小組賽的門票 同時拿到的還有乙份標註各大場館位置的北京地圖,以及一本 奧運會觀眾指南 主要介紹各場館位置 交通 內部布局等。其實,我原來打算的很好 在 鳥巢 看完開幕式之後,當天晚上不可能回大連了,...