您的位置:首页 > 其它

关于45度遍历二维数组的一点记录

2016-01-04 16:09 295 查看
主要用到扫描行的思想




红色虚线即代表扫描行

在对二维数组进行赋值时,二维数组的纵坐标是由X和扫描行之间的一些关系得到,而这个关系则控制了该倾斜遍历究竟是以下图中的哪一种




需要注意的是扫描行的区间在于0 ~ 2 * 宽度 - 1(在此讨论的是长宽相等的二维数组,但其实即使长宽不等,只要改变数据就行了,思路是一样的)

另外需要注意的是,因为扫描行的区间位于0 ~ 2 * 宽度 - 1,因此在遍历过程中会出现得出的纵坐标不在0~宽度这个范围内,那么就需要加上一个约束条件

具体请看代码,只要合理的改变X的起、止以及横纵坐标的调换就能得到几乎所有方向的二维数组的遍历

[code]//
//  main.cpp
//  test
//
//  Created by BppleMan‘s Mac on 16/1/3.
//  Copyright © 2016年 BppleMan's Mac. All rights reserved.
//

#include <iostream>
#define SIZE 3 //SIZE来控制数组宽度
using namespace std;
const int S = 20; //数组的容器大小
int a[S][S];
//一个输出函数
void display()
{
    int i,j;
    for (i = 0; i < SIZE; i++)
    {
        for (j = 0; j < SIZE; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
}
int main(int argc, const char * argv[])
{
    int x,y,count = 1;

    /*
     1 3 6
     2 5 8
     4 7 9
     */

    //2 * SIZE - 1就是扫描行的最大行数
    for (y = 0; y < 2 * SIZE - 1; y++)
    {
        for (x = 0; x < SIZE; x++)
        {
            //控制纵坐标的范围是0~SIZE
            if(y - x >= 0 && y - x < SIZE)
                //通过找规律的到y与x的关系以此确定纵坐标
                a[y - x][x] = count++;
        }
    }
    display();

    /*
     1 2 4
     3 5 7
     6 8 9
     */
    count = 1;
    for (y = 0; y < 2 * SIZE - 1; y++)
    {
        for (x = 0; x < SIZE; x++)
        {
            if(y - x >= 0 && y - x < SIZE)
                a[x][y - x] = count++;
        }
    }
    display();

    /*
     4 2 1
     7 5 3
     9 8 6
     */
    count = 1;
    for (y = 0; y < 2 * SIZE - 1; y++)
    {
        for (x = 0; x < SIZE; x++)
        {
            if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE)
                a[x+y-(SIZE-1)][x] = count++;
        }
    }
    display();

    /*
     6 3 1
     8 5 2
     9 7 4
     */
    count = 1;
    for (y = 0; y < 2 * SIZE - 1; y++)
    {
        for (x = SIZE-1; x >= 0; x--)
        {
            if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE)
                a[x+y-(SIZE-1)][x] = count++;
        }
    }
    display();

    /*
     6 8 9
     3 5 7
     1 2 4
     */
    count = 1;
    for (y = 0; y < 2 * SIZE - 1; y++)
    {
        for (x = SIZE-1; x >= 0; x--)
        {
            if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE)
                a[x][x+y-(SIZE-1)] = count++;
        }
    }
    display();

    /*
     4 7 9
     2 5 8
     1 3 6
     */
    count = 1;
    for (y = 0; y < 2 * SIZE - 1; y++)
    {
        for (x = 0; x < SIZE; x++)
        {
            if(x+y-(SIZE-1) >= 0 && x+y-(SIZE-1) < SIZE)
                a[x][x+y-(SIZE-1)] = count++;
        }
    }
    display();
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: