輸入一個自然數(shù)N(2≤N≤9),要求輸出如下的魔方陣,即邊長為N*N,元素取值為1至N*N,1在左上角,呈順時針方向依次放置各元素。
N=3時:
1 2 3
8 9 4
7 6 5
【輸入形式】
從標(biāo)準(zhǔn)輸入讀取一個整數(shù)N。
【輸出形式】
向標(biāo)準(zhǔn)輸出打印結(jié)果。輸出符合要求的方陣,每個數(shù)字占5個字符寬度,向右對齊,在每一行末均輸出一個回車符。
【輸入樣例】
4
【輸出樣例】
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
#include <iostream>
void fantasy(const int n) {
int array[n][n];
int topLeft[2] = { 0, 0 };
int topRight[2] = { 0, n - 1 };
int bottomRight[2] = { n - 1, n - 1 };
int bottomLeft[2] = { n - 1, 0 };
int row, col;
int counter = 0;
while (true) {
// Go right.
row = topLeft[0];
col = topLeft[1];
while (col <= topRight[1]) {
array[row][col++] = ++counter;
}
topRight[0] += 1;
topRight[1] -= 1;
// Go down.
row = topRight[0];
col = topRight[1] + 1;
while (row <= bottomRight[0]) {
array[row++][col] = ++counter;
}
bottomRight[0] -= 1;
bottomRight[1] -= 1;
// Go left.
row = bottomRight[0] + 1;
col = bottomRight[1];
while (col >= bottomLeft[1]) {
array[row][col--] = ++counter;
}
bottomLeft[0] -= 1;
bottomLeft[1] += 1;
// Go up.
row = bottomLeft[0];
col = bottomLeft[1] - 1;
while (row > topLeft[0]) {
array[row--][col] = ++counter;
}
topLeft[0] += 1;
topLeft[1] += 1;
// End ?
if (topLeft[1] >= topRight[1]) {
if (n % 2 != 0) {
array[n / 2][n / 2] = ++counter;
}
break;
}
}
// Output the result.
for (int row = 0; row < n; ++row) {
for (int col = 0; col < n; ++col) {
std::cout << array[row][col] << "\t";
}
std::cout << std::endl;
}
}
int main() {
for (int i = 2; i <= 9; ++i) {
fantasy(i);
std::cout << std::endl;
}
return 0;
}
聯(lián)珠頂真的回文詩:
鶯啼岸柳
月明弄
夜睛春
鶯啼岸柳弄春睛
柳弄春睛夜月明
明月夜睛春弄柳
睛春弄柳岸啼鶯