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;
} 
时间: 2024-10-12 12:12:28

XidianOJ 1055 如此遍历的相关文章

xdoj

1000.a+b. #include<bits/stdc++.h> using namespace std; int a,b; int main() { ios::sync_with_stdio(false); while(cin >> a >> b) cout << a+b << endl; return 0; } 1001.直接开数组回爆内存,于是自己开个一维数组存放元素,大小需要自己斟酌.(或者动态数组) 直接处理对应位置,根据最后对应的位

hihoCoder #1055 : 刷油漆 [ 树形dp ]

传送门 结果:Accepted     提交时间:2015-05-11 10:36:08 #1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并且保证任意两个小球间都不存在两条不同的路径可以互相到达.没错,这次说的还是这棵树玩具的故事! 小Ho的树玩具

C#实现二叉树的遍历

C#实现二叉树的前序.中序.后序遍历. public class BinaryTreeNode     {         int value;         BinaryTreeNode left;         BinaryTreeNode right;         /// <summary>         /// 前序遍历         /// </summary>         /// <param name="tree">&l

Android sqlite cursor的遍历

查询并获得了cursor对象后,用while(corsor.moveToNext()){}遍历,当corsor.moveToNext()方法调用,如果发现没有对象,会返回false public List<MMImage> getAll() { List<MMImage> list = new ArrayList<MMImage>(); Cursor c = null; try { c = database.query(TABLE, null, null, null,

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

【数据算法】Java实现二叉树存储以及遍历

二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过LinkedList保存Node节点对象 在操作过程中我们需要将当前结点和前一节点.后一节点进行关系绑定 package tree; import java.util.LinkedList; import java.util.List; /** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 *

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

[复试机试]已知中序遍历和后序遍历,求前序遍历

#include<iostream> #include<stack> #include<string> using namespace std; typedef struct no { char data; struct no *lchild,*rchild; }*node; void create(node &root,string sa,string sb)///根据中/后序遍历,建树 { if(sa.length() == 0) return ; root

OpenCV中对Mat的遍历访问与赋值

一.访问 对于Mat的访问有两种方式 第一种,利用Mat::at进行访问 //读取3通道彩色图像 Mat img = imread("图片地址"); int px; //读取图像中第一行第一列,Blue通道数据 int px = img.at<Vec3b>(0, 0)[0]; 第二种,利用Mat的成员ptr指针进行访问 //读取3通道彩色图像 Mat img = imread("图片地址"); //将Mat中的第一行地址赋予pxVec uchar* px