题解:
题目难度:中等难度
知识点:二维数组
方法一:
由于输入行列数比较少,所以可以采用遍历整个数组,找到当前数字放入的位置。然后再找下一个数字所放位置。如下表,红色数字为该数组位置行列下标和,与对应填入的数字我们可以通过三层循环,完成数字填入:
步骤一:最外层循环:每次填入数字的下标和(0到m+n-2)
步骤二:内两层循环:由于存在下标和相同的情况,从图中可以看到,下标相同时行数越小是,所对应的填入数字越小,所以外层循环为遍历行,内层循环为遍历列。
using namespace std; int a[10][10]; int main(){ int n,m; cin>>n>>m; int c=1; for(int k=0;k<=m+n-2;k++) for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if(i+j==k) { a[i][j]=c; c++; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<a[i][j]<<" "; } cout<<endl; } return 0; }
方法二:
从图可以看出:
步骤一:每个箭头的初始下标(红色箭头),首先是行下标m=0,列下标遍历0-n。用一层循环for(int j=0;j<m;j++)即可表示,从初始位置点依次找到该箭头所包含的坐标,其特点为行下标依次增加一,列下标依次减小一,直到超过数字下标范围。
步骤二:箭头初始下标(黑色箭头),行下标遍历1-m,列下标初始值为n-1。该层循环用 for(int i=1;i<n;i++)表示。其内部与步骤一内部一致。
#include<iostream> using namespace std; int a[10][10]; int main(){ int n,m; cin>>n>>m; int c=1; for(int j=0;j<m;j++){ for(int i=0,k=j; ;i++,k--){ if(i<n&&k>=0){ a[i][k]=c; c++; }else break; } } for(int i=1;i<n;i++){ for(int k=i,j=m-1; ;k++,j--){ if(k<n&&j>=0){ a[k][j]=c; c++; }else break; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<a[i][j]<<" "; } cout<<endl; } return 0; }