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上做的,每次做法都不同,我感觉前几次的想法都太乱了,用的时间也比较多
这个思路还是比较清楚的,就根据题目进行模拟就行了,所以问题就是怎么模拟的事情。
如果有更好的方法欢迎交流!

浙公网安备 33010602011771号