給定一個正整數n,輸出如下n*n 之字方陣
分析:首先由圖可知有四種狀態
設i爲行,j爲列,共有n行s列。
設置一個標誌k,初始值爲0
1.向右或向下走,用k=0表示此狀態,考慮邊界條件:在上邊界,或在右邊界。
因此,只需滿足i+j<s-1
2.向左下 ,用k=1表示此狀態,考慮向左下走一直到左邊界或下邊界。
3. 向下或向右走,用k=2表示此狀態,考慮邊界在左邊界,或下邊界。
4.向右上走,用k=3表示此狀態,考慮向右上走一直到上邊界或者右邊界。
代碼實現:
#include<iostream>
#define M 100
#define N 100
using namespace std;
int a[M][N] = { 0 };
void fun(int n,int s)
{
int k = 0; //標記
int i = 0, j = 0;
int m = 1;
a[0][0] = m;
while (m < n*s)
{
switch (k)
{
case 0: //向右或向下
if (i + j < s - 1 )
{
j++;
m++;
a[i][j] = m;
k = (k + 1) % 4;
}
else
{
i++;
m++;
a[i][j] = m;
k = (k + 1) % 4;
}
break;
case 1: //向左下
while (i< n -1 && j> 0)
{
i++, j--;
m++;
a[i][j] = m;
}
k = (k + 1) % 4;
break;
case 2: //向下或向右
if (i + j < n - 1)
{
i++;
m++;
a[i][j] = m;
k = (k + 1) % 4;
}
else
{
j++;
m++;
a[i][j] = m;
k = (k + 1) % 4;
}
break;
case 3: //向右上
while (i > 0 && j < s - 1)
{
i--, j++;
m++;
a[i][j] = m;
}
k = (k + 1) % 4;
break;
}
}
}
void display(int n,int s)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < s; j++)
{
printf("%5d", a[i][j]);
}
cout << endl;
}
}
void main()
{
int n;
int s;
cout << "請輸入行:";
cin >> n;
cout << "請輸入列:";
cin >> s;
fun(n,s);
display(n,s);
}