首页 > 代码库 > XidianOJ 1055 如此遍历

XidianOJ 1055 如此遍历

题目描述

已知一个n*m的矩阵,希望你能按照下图所示的规律进行遍历,并把遍历的结果输出。

技术分享

对于如图,遍历的结果为:
1 4 2 3 5 7 8 6 9

 

输入

多组数据

每组数据第一行输入n,m(1<=n,m<=50),表示矩阵的大小。

接下来n行,每行包括m个正整数,表示矩阵每行m个元素。

 

输出

输出遍历结果,并换行

--正文

直接模拟就好了,为了方便起见,开一个比较大的矩阵,来一些辅助的0

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int rect[1000][1000];
int visit[1000][1000];
int main(){
    int n,m;
    while (scanf("%d %d",&n,&m) != EOF){
        memset(rect,0,sizeof(rect));
        memset(visit,0,sizeof(visit));
        int i,j;
        for (i=1;i<=n;i++){
            for (j=1;j<=m;j++){
                scanf("%d",&rect[i][j]);
            }
        }
        int nowx = 1,nowy = 1;
        int nowd = 1; // 1 down  2 right-up 3 right 4 left-down
        visit[1][1] = 1; printf("%d",rect[1][1]);
        while ( true ){
            if (rect[nowy][nowx] != 0 && !visit[nowy][nowx]) printf(" %d",rect[nowy][nowx]);
            visit[nowy][nowx] = 1;
            if (nowy == n && nowx == m) break;
            if (nowd == 1) {
                nowy ++; nowd = 2; continue;
            }
            if (nowd == 2) {
                if (nowy > 1) {
                    nowx ++; nowy --; continue; 
                }
                else {
                    nowd = 3; continue;
                }
            }
            if (nowd == 3) {
                nowx ++; nowd = 4; continue;
            }
            if (nowd == 4) {
                if (nowx > 1) {
                    nowx --; nowy ++; continue; 
                }
                else {
                    nowd = 1; continue;
                }
            }
        }
        printf("\n");
    }
    return 0;
} 

 

XidianOJ 1055 如此遍历