![]() |
#2
仰望星空的2015-11-11 10:03
|

//输出N*N的数组
//1.先将1填在方阵第一行中间,即(1,(n+1)/2)的位置
//2.一个数填在上一个数的主对角线的上方
//若上一个数的位置是(i,j),下一个数应填在(i1,j1),其中i1=i-1,j1=j-1
//3.若填写的位置下标出界,则出界的值用n替代,即若i-1=0,则取i1=n
//若j-1=0,则取j1=n
//4.若填写的位置没有出界,但已经填有数的话,则应填在上一个数的下面(行减1,列不变)
//即取i1=i-1,j1=j
//5.这样循环直到n*n全部输入到方阵中
#include <iostream>
using namespace std;
int main(void)
{
//i,j分别表示当前数组的行和列
//i1,j1分别表示该数(i,j)的对角线上方
//i1 = i - 1, j1 = j - 1
int i, j, i1, j1, x, n, a[100][100];
cout<<"Input an odd number: ";
cin>>n;
//将从1到n的数组都初始化为0
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
a[i][j] = 0;
//检查是否为奇数,如果为奇数继续程序
//否则结束程序
if (n % 2 == 0)
{
cout<<"Input error.";
return 0;
}
//执行第一步,先将1填写在方阵第一行中间
//即(1,(n+1)/2)的位置
i = 1;
j = int((n + 1)/2);
//x从1开始到小等于n*n的数可以填写在方阵中
x = 1;
while(n*n >= x)
{
a[i][j] = x; //此时i=1,j=((n+1)/2),即为第一行的中间位置
x += 1;
//41-45:将i1的j1分别赋值给i和j,接着将i,j自减1
//此时a[i][j]的位置在a[i1][j1]的对角线的斜上方
i1 = i;
j1 = j;
i -= 1;
j -= 1;
//如果行(i)等于0,则i等于该数组的下界(n)
if (i == 0) i = n;
//同理
if (j == 0) j = n;
//4.若填写的位置没有出界,但已经填有数的话,则应填在上一个数的下面(行减1,列不变)
//即取i1=i-1,j1=j
if (a[i][j] != 0)
{
i = i1 + 1;
j = j1;
}
}
//输出该数组
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
cout<<a[i][j]<<"\t";
cout<<endl;
}
return 0;
}
这是个输出九宫格的程序,感觉每一行要做什么都懂了,合起来就不懂了.请教下论坛的朋友们这个程序的原理是什么?自己写的注释有点多...
//1.先将1填在方阵第一行中间,即(1,(n+1)/2)的位置
//2.一个数填在上一个数的主对角线的上方
//若上一个数的位置是(i,j),下一个数应填在(i1,j1),其中i1=i-1,j1=j-1
//3.若填写的位置下标出界,则出界的值用n替代,即若i-1=0,则取i1=n
//若j-1=0,则取j1=n
//4.若填写的位置没有出界,但已经填有数的话,则应填在上一个数的下面(行减1,列不变)
//即取i1=i-1,j1=j
//5.这样循环直到n*n全部输入到方阵中
#include <iostream>
using namespace std;
int main(void)
{
//i,j分别表示当前数组的行和列
//i1,j1分别表示该数(i,j)的对角线上方
//i1 = i - 1, j1 = j - 1
int i, j, i1, j1, x, n, a[100][100];
cout<<"Input an odd number: ";
cin>>n;
//将从1到n的数组都初始化为0
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
a[i][j] = 0;
//检查是否为奇数,如果为奇数继续程序
//否则结束程序
if (n % 2 == 0)
{
cout<<"Input error.";
return 0;
}
//执行第一步,先将1填写在方阵第一行中间
//即(1,(n+1)/2)的位置
i = 1;
j = int((n + 1)/2);
//x从1开始到小等于n*n的数可以填写在方阵中
x = 1;
while(n*n >= x)
{
a[i][j] = x; //此时i=1,j=((n+1)/2),即为第一行的中间位置
x += 1;
//41-45:将i1的j1分别赋值给i和j,接着将i,j自减1
//此时a[i][j]的位置在a[i1][j1]的对角线的斜上方
i1 = i;
j1 = j;
i -= 1;
j -= 1;
//如果行(i)等于0,则i等于该数组的下界(n)
if (i == 0) i = n;
//同理
if (j == 0) j = n;
//4.若填写的位置没有出界,但已经填有数的话,则应填在上一个数的下面(行减1,列不变)
//即取i1=i-1,j1=j
if (a[i][j] != 0)
{
i = i1 + 1;
j = j1;
}
}
//输出该数组
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
cout<<a[i][j]<<"\t";
cout<<endl;
}
return 0;
}
这是个输出九宫格的程序,感觉每一行要做什么都懂了,合起来就不懂了.请教下论坛的朋友们这个程序的原理是什么?自己写的注释有点多...