寒假每日一题活动-------蛇形矩阵

寒假每日一题活动-------蛇形矩阵

今日份算法题,有点类似迷宫问题,做法也是类似搜索题的套路,属于模版题

  • 题目

输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式

输入共一行,包含两个整数n和m。

输出格式

输出满足要求的矩阵。

矩阵占n行,每行包含m个空格隔开的整数。

数据范围

1 ≤ n,m ≤ 100

输入样例:

3 3

输出样例:

1 2 3
8 9 4
7 6 5
  • 解释

一个map数组来存放数字,一个st数组来标记是否走过,定义方向数组,上下左右四个方向,然后我们从(0,0)点出发,朝四个方向走,同时判断边界条件,在矩阵内且没有被标记为走过,则填入数字。同时有一个转向的问题,当我们碰壁后,即变换后的坐标出了n矩阵的范围,又或者是变换后的位置已经走过了 ,就要开始转向,方向数组的index变化,然后继续走

  • 代码
#include<iostream>
using namespace std;
const int N = 110;

int n, m;
int map[N][N];
bool st[N][N];

int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; 

int main() {
    cin >> n >> m;
    int x = 0, y = 0, d = 1;

    for (int i = 0; i < n * m; i ++ ) {
        map[x][y] = i + 1 ;
        st[x][y] = true;
      
        int a = x + dx[d], b = y + dy[d];
        if (a < 0 || a >= n || b < 0 || b >= m || st[a][b]) {
            d = (d + 1) % 4;
            a = x + dx[d], b = y + dy[d];
        }
        x = a, y = b;
    }

    for (int i = 0; i < n ; i ++ )
    {
        for (int j = 0 ; j < m; j ++ )
            cout << map[i][j] << ' ';
        cout << endl;
    }
    return 0;
}
  • 做法二

当然还有更加暴力的模拟法,直接来模拟上下左右四个方向的情况

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int m, n, x = 0, y = -1, c;
    cin >> m >> n;
    int t = m * n;
    int a[m][n];
    fill(a[0], a[0]+t, 0);
    for(int i = 0; i < t; ){
        while(y < n-1 && !a[x][y+1]){//右
            a[x][++y] = ++i;
        }
        while(x < m-1 && !a[x+1][y]){//下
            a[++x][y] = ++i;
        }
        while(y > 0 && !a[x][y-1]){//左
            a[x][--y] = ++i;
        }
        while(x > 0 && !a[x-1][y]){//上
            a[--x][y] = ++i;
        }
    }
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            cout << a[i][j];
            if(j != n-1) cout << ' ';
        }
        cout << endl;
    }
}
posted @ 2021-01-11 11:40  阿-栋  阅读(245)  评论(0编辑  收藏  举报