蛇形矩阵题目描述:
坐标模拟:用d来控制执行方向
int d = 1;
int dx[4] = {
-1,0,1,0};
int dy[4] = {
0,1,0,-1};
方向转移:
- 条件:超出范围,预转移的位置已经存放数据
- 方式:满足条件则重新生成方向,d = (d + 1) % 4;
for(int i = 1;i <= m * n; i ++){
state[x][y]=i;
// 满足条件则改变方向
if((x + dx[d] > n)||(x + dx[d] < 1)||(y + dy[d] > m)||(y + dy[d] < 1)||(state[x+dx[d]][y+dy[d]])){
d = (d + 1) % 4; // 重新生成方向
}
x += dx[d];
y += dy[d];
}
完整代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e4;
int n,m,state[N][N];
int dx[4] = {
-1,0,1,0};
int dy[4] = {
0,1,0,-1};
int main(){
cin>>n>>m;
int d = 1;
int x = 1, y = 1;
for(int i = 1;i <= m * n; i ++){
state[x][y]=i; // 开始赋值
// 满足条件则改变方向
if((x + dx[d] > n)||(x + dx[d] < 1)||(y + dy[d] > m)||(y + dy[d] < 1)||(state[x+dx[d]][y+dy[d]])){
d = (d + 1) % 4; // 重新生成方向
}
x += dx[d];
y += dy[d];
}
// 输出
for(int i = 1;i <= n; i ++){
for(int j = 1; j <= m; j ++)
cout<<state[i][j]<<' ';
cout<<endl;
}
return 0;
}