Test Message

b367: 翻轉世界

內容

有位勇士排除萬難後,來到了最後一關—–[翻轉世界]

他發現所有物品都翻轉了 180 度

如果要繼續前進必須做出一項選擇,也就是找到翻轉後不會改變的東西!

例如:

110

000

011

若翻轉 180 度:

110

000

011

現在給你一張圖

請你幫忙這位勇士吧,因為除了必須判斷這個問題以外,還必須打倒翻轉世界的怪物才行

所以請你寫一個程式幫他


輸入

每行有一正整數 T(T<11),代表有幾組測試資料

接下來有 T 行, 每行有 N、M 兩正整數

N 代表長,M 代表寬 (0<N,M<11)

而接下會有 N 行,每一行會有 M 個數字 r (0<=r<231-1)

2
3 3
1 1 0
0 1 0
0 1 1
1 5
0 0 1 0 1

輸出

對於每個測資,判斷是否可以符合翻轉 180 度不會改變的圖形
是的話請輸出 go forward

否的話請輸出 keep defending

go forward
keep defending


解題思路

讀入陣列,之後分別從頭開始往後和從尾開始往前判斷是否相等,如果某次匹配不相等或是頭 ≥ 尾時斷開,之後輸出答案即可。

Ex: [0 : 20] , [1 : 19] , [2 : 18] … [9 : 11] , [10 : 10]

雖然輸入有二維陣列,但判斷邏輯和上面處理一維陣列的方式是一樣的,所以在輸入時把二微陣列壓縮成一維,方便之後判斷。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>

int main()
{
int kase, n, m, s, e, list[150];
scanf(" %d", &kase);
while (kase--)
{
scanf(" %d %d", &n, &m);
s = 0, e = n * m - 1;
for (int i = 0; i <= e; i++)
scanf(" %d", &list[i]);
while (list[s] == list[e])
{
if (s > e)
break;
s++, e--;
}
puts(s < e ? "keep defending" : "go forward");
}
return 0;
}