CCF 201412-2 Z字形扫描

#include<iostream>
using namespace std;
int list[501][501];
int main() {
    int n;
    cin >> n;
    for(int i = 1 ; i <= n ; i++) {
        for(int j = 1 ; j <= n ; j++) {
            cin >> list[i][j];
        }
    }
    bool dir = 0; //dir表示运动方向 (0 斜上,  1 斜下) 
    int row = 1 , column = 1;//第一个开始是在(1,1)的位置 
    for(int i = 1 ; i <= n ; i++) {
        while(row != 0 && column != 0) {//超出了范围 
            if(dir == 0) {
                cout << list[row][column] << ' ';
                row--,column++;
            } else {
                cout << list[row][column] << ' ';
                row++,column--;
            }
        }
        if(row == 0) row = 1;//将超出范围的拉回来 
        else column = 1;
        dir = !dir;//运动方向改变了 
    }
    
    /***********************************************************************************/
     
    if(dir == 0) {//这是当扫描过了对角线,此时需要将行和列进行调整 
        row = n, column = 2;
    } else {
        row = 2, column = n;
    }
    for(int i = 1 ; i <= n-1 ; i++) {
        while(row != n+1 && column != n+1) {//这里也要和上面不同 
            if(dir == 0) {
                cout << list[row][column] << ' ';
                row--,column++;
            } else {
                cout << list[row][column] << ' ';
                row++,column--;
            }
        }
        if(row == n+1) {//这里也要和上面不同 
            row = n;
            column += 2;
        } else {
            row += 2;
            column = n;
        }
        dir = !dir;
    }
}

做了好几次这个题了,以前都是在学校OJ上做的,每次做法都不同,我感觉前几次的想法都太乱了,用的时间也比较多

这个思路还是比较清楚的,就根据题目进行模拟就行了,所以问题就是怎么模拟的事情。

如果有更好的方法欢迎交流!

posted @ 2022-03-20 15:02  夏莱发电厂的Sensei  阅读(44)  评论(0)    收藏  举报