臭道人

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;
}
View Code

#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]);
        }
    }
}
View Code

性能相差仿佛

posted on 2021-02-18 01:38  臭总  阅读(42)  评论(0编辑  收藏  举报

导航