2.17
https://www.acwing.com/problem/content/3211/
z扫描
两种找规律:
①
#include <iostream> using namespace std; const int N = 510; int a[N][N]; int main(){ ios::sync_with_stdio(false);cin.tie(0); int n; cin >> n; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) cin >> a[i][j]; int x = 0, y = 0; bool flag = true;//方向一:ture就x--,y++。方向二:false就x++,y--。 while(x != n || y != n){ //关于这里为什么需要特判,主要是因为,x和y都有可能大于边界n。 //(如果还是不清楚的话可以拿我代码模拟下,可以试着删掉下方的if,然后拿例子去调试下) if(x < n && y < n) cout << a[x][y] << ' '; if(flag) x--, y++; else x++, y--; if(x < 0) { x = 0; flag = !flag;//x < 0 说明x坐标越界了,把x纠正过来,然后让flag置反 } if(y < 0){ y = 0; flag = !flag;//y < 0 说明y坐标越界了,把y纠正过来,然后让flag置反 } } return 0; }
②
#include<iostream> using namespace std; const int m=510; int a[m][m],n; int main() { cin>>n; int i,j; for(i=1;i<=n;i++)//行列从下标1开始 for(j=1;j<=n;j++) scanf("%d",&a[i][j]); for(i=2;i<=n*2;i++)//因为下标从1开始且第一行属于偶数行. { if(i%2)//奇数行从下往上 { for(j=1;j<i;j++) if(j>=1&&j<=n&&i-j>=1&&i-j<=n) printf("%d ",a[j][i-j]); } else //偶数行上往下 { for(j=i-1;j;j--) if(j>=1&&j<=n&&i-j>=1&&i-j<=n) printf("%d ",a[j][i-j]); } } }
性能相差仿佛