D3 756.蛇形矩阵(数组 模拟)

AC代码

#include<iostream>

using namespace std;

const int N = 105;

int n,m,arr[N][N];    ///n--行数 m--列数 arr--矩阵
int dr[4][2]={{0,1},{1,0},{0,-1},{-1,0}};     ///方向数组,右下左上的顺序
bool judge(int x,int y){        ///判断是否越界
    if(x<0||x>=n||y<0||y>=m)
        return false;
    else
        return true;
}

int main(){
    cin>>n>>m;
    for(int i=0;i<n;++i)        ///初始化数组为-1
        for(int j=0;j<m;++j)
            arr[i][j]=-1;
    int x=0,y=-1;     ///起始坐标
    int count=0;      ///计数变量
    while(1){      ///模拟了沿一个方向走到不能再走
        for(int j=0;j<4;++j){     
            while(arr[x+dr[j][0]][y+dr[j][1]]==-1&&judge(x+dr[j][0],y+dr[j][1])){  ///判断是否还能沿这个方向走
                x=x+dr[j][0];y=y+dr[j][1];
                arr[x][y]=++count;
            }
        }
        if(count==n*m)
            break;
    }
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j)
            cout<<arr[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

另一种模拟法

#include<iostream>

using namespace std;

const int N = 105;

int n,m,arr[N][N];    ///n--行数 m--列数 arr--矩阵
int dr[4][2]={{0,1},{1,0},{0,-1},{-1,0}};     ///方向数组,右下左上的顺序
bool judge(int x,int y){        ///判断是否越界
    if(x<0||x>=n||y<0||y>=m)
        return false;
    else
        return true;
}

int main(){
    cin>>n>>m;
    for(int i=0;i<n;++i)        ///初始化数组为-1
        for(int j=0;j<m;++j)
            arr[i][j]=-1;
    int x=0,y=0,d=0;        ///起始坐标 d--控制当前方向
    for(int i=1;i<=n*m;++i){
        arr[x][y]=i;
        int x1=x+dr[d][0],y1=y+dr[d][1];
        if(!judge(x1,y1) || arr[x1][y1]!=-1){   ///下个位置非法的情况
            d=(d+1)%4;       ///用取模实现方向轮换
            x1=x+dr[d][0];
            y1=y+dr[d][1];
        }
        x=x1;y=y1;
    }

    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j)
            cout<<arr[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

引入参数d模拟一直朝着某个方向走,(d+1)%4 实现方向的循环轮换

要点

方向数组+边界控制,模拟蛇形行走

 

相关题目

AcWing 844. 走迷宫
AcWing 1102. 移动骑士
AcWing 1421. 威斯康星方形牧场

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值