(后称表①) | 第0行 | 第1列 | 第2列 | 第3列 |
第0行 | t[0][0],temp=1 | t[0][1],temp=3 | t[0][2],temp=4 | t[0][3],temp=10 |
第1行 | t[1][0],temp=2 | t[1][1],temp=5 | t[1][2],temp=9 | |
第2行 | t[2][0],temp=6 | t[2][1],temp=8 | ||
第3行 | t[3][0],temp=7 |
根据表①主要是找j 和 k(也就是行列)的对应关系,下表,(后称表②)
i | j(行) | k(列) | temp |
1 | 0 | 0 | 1 |
2 | 1 | 0 | 2 |
0 | 1 | 3 | |
3 | 0 | 2 | 4 |
1 | 1 | 5 | |
2 | 0 | 6 | |
4 | 3 | 0 | 7 |
2 | 1 | 8 | |
1 | 2 | 9 | |
0 | 3 | 10 |
由上就可以知道 i=j+k+1( i= 行值+列值-1,i值作用在后面说明)得出第一个外层循环
for(i=1;i<n;i++){
//赋值语句
}
然后观察temp的值在表①中是蛇形变化,在表②中得出
i%2==1时,行j从i-k-递增,列k从0递增
i%2==0时,行j从0递增,列k从i-1-j递减
通过这两个判断进行不同循环给数组t对应位置赋值;(t[j][k] = temp++;也可以直接用t[j][k] = i;为了区分用了temp)
i值可以理解为循环次数以及每次循环要赋值的个数,第一个循环赋值1次,第二个循环赋值2次依次类推;
if (i % 2) {
for (int j = 0, k = i-1; k>=0;k=k-1,j=i-1-k) {
t[j][k] = temp++;
}
}
else{
for (int j = i-1, k = 0; j>=0;j=j-1,k=i-1-j) {
t[j][k] = temp++;
}
}
最终代码如下:
//C++
#include<iostream>
#include <iomanip>
using namespace std;
#define max 20
int main() {
int n, temp = 1,i, t[max][max] = { 0 };
cout << "Sample Input:" << endl;
cin >> n;
cout << "Sample Output:" <<endl;
for (i=1; i <= n; i++) {
if (i % 2) {
for (int j = 0, k = i-1; k>=0;k=k-1,j=i-1-k) {
//cout << k << "\t" << j << "\t" << "①" << temp << endl;
t[j][k] = temp++;
}
}
else{
for (int j = i-1, k = 0; j>=0;j=j-1,k=i-1-j) {
//cout << k << "\t" << j << "\t" << "②" << temp << endl;
t[j][k] = temp++;
}
}
}
for (i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
cout << setw(3)<<t[i][j] << " ";
}
cout << endl;
}
}
//C语言
#include<stdio.h>
#define max 20
int main() {
int n, temp = 1,i, t[max][max] = { 0 };
printf("Sample Input:\n" );
scanf("%d",&n);
printf("Sample Output:\n");
for (i=1; i <= n; i++) {
if (i % 2) {
for (int j = 0, k = i-1; k>=0;k=k-1,j=i-1-k) {
t[j][k] = temp++;
}
}
else{
for (int j = i-1, k = 0; j>=0;j=j-1,k=i-1-j) {
t[j][k] = temp++;
}
}
}
for (i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
printf("%3d",t[i][j]);
}
printf("\n");
}
}