题意:
思路:
这道题靠感觉写的for循环,很快就通过了,但是还是感觉不太靠谱,总感觉考场上不能保证一定能写出来这道题,于是写一篇水题题解
这道题考察的是枚举顺序
更换枚举顺序在很多时候都非常实用,比如枚举超时时可以考虑一下更换枚举顺序
此题因为是模拟,我们可以手动模拟一下过程
发现在模拟的过程中首先枚举的是斜线,然后枚举的是斜线里的位置,因此需要两层for循环
注意到斜线中i+j为常数,因此第一层循环枚举i+j的和
第二层for循环去枚举行数i即可,这样列数j自然就出来了
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=1e2+10;
int n,cnt=0;
int a[mxn][mxn];
int main(){
scanf("%d",&n);
for(int sum=2;sum<=n+1;sum++){
for(int i=sum-1;i>=1;i--){
a[i][sum-i]=++cnt;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1-i;j++) printf("%d%c",a[i][j],j==n+1-i?'\n':' ');
}
return 0;
}
总结:
遇到这种不是特别直观的枚举可以手动模拟一下,看看枚举的具体顺序
又水了一篇题解(