Problem
http://zerojudge.tw/ShowProblem?problemid=b367
Thinking
version1
矩陣翻轉180度其實就是上下翻轉之後,左右翻轉
,最直覺的做法就是在做一個矩陣轉180度,然後跟原本的比對,但是這邊我不這樣做:我們原本讀取陣列的方式是由左至右由上至下
,對矩陣做上下翻轉之後,左右翻轉
,我們對原本的矩陣由右至左由上至下
的去比對,如圖.
/******************************************************/
/* zero judge b367 version1 pseudo code */
/******************************************************/
row <- initialize from input
col <- initialize from input
matrix[][] <- initialize from input
check <- true
for i <- 1 to row
{
for j <- 1 to col
{
if(matrix[i][j] != matrix[row - i + 1][col - j + 1])
{
check = false
break
}
}
}
if check is true
output "go forward"
else
output "keep defending"
version2
由上一個做法可以知道,會重複比對(row*col)/2
次,我們只要比對row*col/2
次就好如圖.
/******************************************************/
/* zero judge b367 version2 pseudo code */
/******************************************************/
row <- initialize from input
col <- initialize from input
matrix[][] <- initialize from input
check <- true
for i <- 1 to (row + 1)/2
{
for j <- 1 to col/2
{
if(matrix[i][j] != matrix[row - i + 1][col - j + 1])
{
check = false
break
}
}
}
if check is true
output "go forward"
else
output "keep defending"
version3
昨天突然一個靈光乍現,如果把這個二維陣列拉平,不就是一個更簡單的判斷reverse有沒有一樣的問題而已啊.如圖
/******************************************************/
/* zero judge b367 version3 pseudo code */
/******************************************************/
row <- initialize from input
col <- initialize from input
// flatten two dim list to one dim
matrix[] <- initialize from input
length <- row * col
check <- true
for i <- 1 to length/2
{
if(matrix[i] == matrix[length - i + 1])
{
check = false
break
}
}
if check is true
output "go forward"
else
output "keep defending"
Implementation
以下答案上傳皆是AC
version2
#include <iostream>
using namespace std;
int main(){
int testcase;
while(cin >> testcase)
{
for(int i = 0 ; i < testcase ; i++)
{
int row,col;
bool check = true;
cin >> row >> col;
int matrix[15][15] = {0};
for(int i = 1 ; i <= row ; i++)
for(int j = 1 ; j <= col ; j++)
cin >> matrix[i][j];
for(int i = 1 ; i <= (row+1)/2 ; i++)
for(int j = 1 ; j <= col/2 ; j++)
{
if(matrix[i][j] != matrix[row - i + 1][col - j + 1])
{
check = false;
break;
}
}
if(check)
cout << "go forward" << endl;
else
cout << "keep defending" << endl;
}
}
version3
#include <iostream>
using namespace std;
int main(){
int testcase;
while(cin >> testcase)
{
for(int i = 0 ; i < testcase ; i++)
{
int row,col;
bool check = true;
cin >> row >> col;
int matrix[300] = {0};
for(int i = 1 ; i <= row * col; i++)
cin >> matrix[i];
for(int i = 1 ; i <= row * col / 2 ; i++)
{
if(matrix[i] != matrix[row*col-i+1])
{
check = false;
break;
}
}
if(check)
cout << "go forward" << endl;
else
cout << "keep defending" << endl;
}
}
}