目標
要變成觀念:
1、如果矩陣的元素matrix[i][j]中縱坐標j是偶數,並且i==0或i==SIZE-1,那麼遍歷路徑在矩陣中的走向就是向右移動一格。
條件寫成程式碼:
if (j%2==0&&(i==0||i==SIZE-1)) {
j++;
continue;
}
2、如果矩陣的元素matrix[i][j]中橫坐標i是奇數,並且j==0或j==SIZE-1,那麼遍歷路徑在矩陣中的走向就是向下移動一格。
條件寫成程式碼:
if (i%2==1&&(j==0||j==SIZE-1)) {
i++;
continue;
}
3、除以上規律情況之外,如果矩陣的元素matrix[i][j]的橫縱坐標之和i+j為偶數,那麼遍歷路徑在矩陣中的走向就是向右上角移動一格;否則,如果i+j是奇數,那麼遍歷路徑在矩陣中的走向就是向左下角移動一格。
條件寫成程式碼:
if ((i+j)%2==0) {
j++;
i--;
} else if ((i+j)%2==1) {
j--;
i++;
}
測試程式碼:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int i,j,x,y,SIZE;
i=0,j=0,SIZE=8;
for(x=0;x<SIZE;x++) {
for(y=0;y<SIZE;y++) {
cout <<"i= "<<i<<" j= "<<j<<" x= "<<x<<" y= "<<y<<endl;
if ((i==0||i==SIZE-1)&&j%2==0) {
j++;
continue;
}
if ((j==0||j==SIZE-1)&&i%2==1) {
i++;
continue;
}
if ((i+j)%2 ==0) {
i--;
j++;
} else if((i+j)%2 ==1){
i++;
j--;
}
}
}
}
今將測試程式碼改寫成"二維陣列"如下:
#include <iostream>#include <iomanip>
using namespace std;
int main() {
int i,j,x,y,SIZE;
i=0,j=0,SIZE=8;
int a[SIZE][SIZE] = {0};
int b[SIZE][SIZE] = {0};
cout <<endl<<"變更前的矩陣"<<endl;
for(i=0;i<SIZE;i++) {
for(j=0;j<SIZE;j++) {
if(a[i][j]!=0) {
a[i][j]=0;
}
if(b[i][j]!=0) {
b[i][j]=0;
}
a[i][j] = i*SIZE+j;
cout <<setw(4)<<a[i][j]<<" ";
}
cout <<endl;
}
i=0;j=0;
for(x=0;x<SIZE;x++) {
for(y=0;y<SIZE;y++) {
//cout <<"i= "<<i<<" j= "<<j<<" x= "<<x<<" y= "<<y<<endl;
b[i][j]=a[x][y];
//cout <<setw(4)<<b[i][j]<<setw(4)<<a[x][y]<<endl;
if ((i==0||i==SIZE-1)&&j%2==0) {
j++;
continue;
}
if ((j==0||j==SIZE-1)&&i%2==1) {
i++;
continue;
}
if ((i+j)%2 ==0) {
i--;
j++;
} else if((i+j)%2 ==1){
i++;
j--;
}
}
}
cout <<endl<<"變更後的矩陣"<<endl;
i=0;j=0;
for(i=0;i<SIZE;i++) {
for(j=0;j<SIZE;j++) {
cout <<setw(4)<<b[i][j]<<" ";
}
cout <<endl;
}
}
其結果如下圖:
資料來源:
1.書籍:演算法之美:隱藏在資料結構背後的原理(C++版)
2.Z字形編排問題詳解(C++)
沒有留言:
張貼留言