寒假每日一题活动-------蛇形矩阵
寒假每日一题活动-------蛇形矩阵
今日份算法题,有点类似迷宫问题,做法也是类似搜索题的套路,属于模版题
- 题目
输入两个整数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;
}
}