AcWing756.蛇形矩阵

题目

分析

对于这类问题,我们采用dx, dy 方向数组来存储,并且将顺时针方向定义为1,2,3,0

撞墙的情况有两种,一个是出去,一个是走重复的格子

 

 

代码

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int N = 110;
 5 int n,m;
 6 int q[N][N];
 7 
 8 int main(){
 9     cin>> n >> m;
10     
11     //定义开始状态,转移增量,方向
12     int x = 0,y = 0;
13     int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};
14     int d = 1;//表示顺时针的四个方向,开始为1横着走
15     
16     
17     for(int i = 1;i <= n * m;i++){
18         q[x][y] = i;
19         
20         //更新坐标
21         int a = x + dx[d],b = y + dy[d];
22         //判断边界,碰撞换方向
23         if(a < 0 || a >= n || b < 0 || b >= m || q[a][b]){
24             d = (d + 1) % 4;
25             a = x + dx[d],b = y + dy[d];
26         }
27         x = a, y = b;
28     }
29     
30     for (int i = 0;i < n;i++){
31         for(int j = 0;j < m;j++){
32             cout << q[i][j]<< " ";
33         }
34         cout<<endl;
35     }
36 }

 

posted @ 2022-03-04 15:12  Uitachi  阅读(117)  评论(0)    收藏  举报