C++/C 蛇形填数

之前参加一个校内实验室考核时,有一道题是蛇形螺旋填数,只不过要求用python实现。

当时一脸懵逼的尝试,结果也没做出来。

谁知,在刘汝佳的《算法竞赛入门经典》里竟有几乎原题,只不过初始position不同罢了,用c语言实现的。

今天看书看到了这里,就试着用c++做了一遍,position选的是(0,0)即左上角。原理还是刘老师的思路,顺序改为--右--下--左--上。

我的代码是这样的:

#include<iostream>
#include<cstring>//因为要用memset函数快速方便地将a数组初始化。
using namespace std;
#define maxn 20
int a[maxn][maxn];
int main()
{
    int n;
    cin>>n;
    memset(a,0,sizeof(a));//将数组a的初值赋值为0,表示还没被填数
    int x=0,y=0,tot=1;//x,y是坐标,tot是从1开始要依次填入的数
    a[0][0]=1;//起点值当然是1咯
    while(tot<n*n){
        while((y+1<n)&&(a[x][y+1]==0))//不越界,未被填过就一直往右走,依次填数
            a[x][++y]=++tot;
        while((x+1<n)&&(a[x+1][y]==0))//向下
            a[++x][y]=++tot;
        while((y-1>=0)&&(a[x][y-1]==0))//向左
            a[x][--y]=++tot;
        while((x-1>=0)&&(a[x-1][y]==0))//向上
            a[--x][y]=++tot;
    
    }
    
    for(int i =0;i<n;i++){
        for(int j=0;j<n;j++)
            printf("%4d",a[i][j]);//遍历输出
        cout<<endl;
    }
    
    return 0;
}

 

 

其实这道题还是蛮需要琢磨的,有很多细节,比如++tot而不是tot++;c语言的短路特性,先判断再做处理比做完反悔更好等等。

记下。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值