给定一个正整数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);
}