题解:

题目难度:中等难度

知识点:二维数组

方法一:

由于输入行列数比较少,所以可以采用遍历整个数组,找到当前数字放入的位置。然后再找下一个数字所放位置。如下表,红色数字为该数组位置行列下标和,与对应填入的数字我们可以通过三层循环,完成数字填入:
图片说明

步骤一:最外层循环:每次填入数字的下标和(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;
}