曲がりくねったマトリックスのタイトルの説明:
座標シミュレーション: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;
}