c语言 编程输出如下n阶蛇形矩阵_牛客C语言基础题目过关5

3b223d0995edda3beb284e156067a0e9.png

题1:回型矩阵,做这题的时候打的代码可读性比较差,代码逻辑也不是很清晰,乱调试混过去的...

我就是想弄个坐标轴,足够大,然后扫描回型矩阵的边长,“在最外层加一层墙”,然后从(1,1)开始往右走,撞墙就顺时针拐弯,跟贪吃蛇一样,不能撞到自己...记得弄个计数器,每走一步计数器加1,而且我们要在坐标中放置的值也是自增的。然后走完所有的步数就不走了。去下面输出每行的内容。

————————分割线————————

1b51905ef1991da5af86bd1c4967d209.png

题2:蛇形矩阵,这题是比之前要难的我感觉...代码上不小心也很容易搞错,啥堆、栈内存溢出啊,段错误啊,数组越界啥的,我也懵懵的,总感觉没道理出现这些问题,调试了好久才发现原来有个num我拼成sum了...和之前那题一样,弄成坐标,然后一步一步走,这个蛇形走法,怎么说呢?它是斜着走的,像" / ",我自然就把移动状态分成两种,右上跟左下,不过在撞墙时它有其它的操作...

移动状态为右上时,运动方向优先级为:向右上>向右>向下   若它没办法向右上走,才会向右走,同理,不能向右走时才能向下走...。要注意,当它向右走或向下走的时候说明撞墙了,要拐弯,拐弯后反向,因此移动状态要改变。改为左下。

移动状态为左下时:优先级:向左下>向下>向右。。。

代码如下:

————————

#include

int sum[1001][1001] = { 0 };

int ti[1001][1001] = { 0 };

int main(void) {

    int num = 1;        //号码计数

    int dir = 1;        //1代表右上 2代表左下

    int x = 1, y = 1;   //初始坐标

    int n;              //矩阵规模

    scanf("%d", &n);

    int k = 0;          //常用计数器

    for (; k <= n; k++) {

        ti[k][n + 1] = 1;

        ti[n + 1][k] = 1;

        ti[0][k] = 1;

        ti[k][0] = 1;

    }

    while (num <= n * n) {

        if ( x < 1 || y < 1) {

            printf("Illegal variable x or y !\n");

            break;

        }

        if (dir == 1) {

            if (ti[x][y] == 0) {

                ti[x][y] = 1;

                sum[x][y] = num++;

                continue;

            }

            else if (ti[x - 1][y + 1] == 0) {

                x -= 1;

                y += 1;

                ti[x][y] = 1;

                sum[x][y] = num++;

                continue;

            }

            else if (ti[x][y + 1] == 0) {

                y += 1;

                ti[x][y] = 1;

                sum[x][y] = num++;

                dir = 2;

                continue;

            }

            else if (ti[x + 1][y] == 0) {

                x += 1;

                ti[x][y] = 1;

                sum[x][y] = num++;

                dir = 2;

                continue;

            }

            else {

                printf("Discovered a unknow error!\n");

                num++;

            }

        }else

        if (dir == 2) {

            if (ti[x][y] == 0) {

                ti[x][y] = 1;

                sum[x][y] = num++;

                continue;

            }

            else if (ti[x + 1][y - 1] == 0) {

                x += 1;

                y -= 1;

                ti[x][y] = 1;

                sum[x][y] = num++;

                continue;

            }

            else if (ti[x + 1][y] == 0) {

                x += 1;

                ti[x][y] = 1;

                sum[x][y] = num++;

                dir = 1;

                continue;

            }

            else if (ti[x][y + 1] == 0) {

                y += 1;

                ti[x][y] = 1;

                sum[x][y] = num++;

                dir = 1;

                continue;

            }

            else {

                printf("Discovered a unknow error!\n");

                num++;

            }

        }

    }

    x = 1;

    for (; x <= n; x++) {

        y = 1;

        for (; y < n; y++) {

            printf("%d ", sum[x][y]);

        }

        printf("%d\n", sum[x][n]);

    }

}

————————

有些内容是不必要的,当时调试的时候为了看出哪里出问题了所以加了点东西。

————————分割线————————

2e9284ae4a326f5f46c3cca52335767c.png

c46b8d2853b8445a771810f5e913e390.png

题3:扫雷,输入一个矩形的内容,' ? '代表未知数字,' * ' 代表一个地雷,输出时要把未知的数字变成确切的数字,也就是以该点为中心的九宫格内地雷总数。刚开始不知道咋处理好,想把所有字符接收到二维字符数组当中,照样是用坐标的方法,然后逐个位判断时都循环逛一遍九宫格,统计个数输出。可是想想就觉得麻烦,没准弄半天最后还超时了,也就没下手。后来在草稿纸上画表格,想看看数字之间有没有啥规律,...每次临时想多加个地雷,旁边的数据又要修改掉,改着改着,忽然觉得可以创建个字符数组用来储存字符,同时创建一个二维数组sum用来储存坐标上的值,检测所有的字符,检测到地雷时取出其坐标,把旁边一圈的坐标储存的数值都加上1,最后输出的时候用字符数组判断该点是不是地雷点,是就输出' * ',不是就输出该坐标sum数组对应的值。要注意换行的规律。

代码如下:

————————

#include

int main(void){

    int row,line;

    char alp[105][105];

    int sum[105][105]={0};

    scanf("%d %d",&row,&line);

    getchar();

    int k = 1;

    while(k<=row){

        int i = 1;

        while(i<=line){

            alp[k][i]=getchar();

            if(alp[k][i]=='*'){

                sum[k-1][i-1]++;    //左上

                sum[k-1][i]++;      //上

                sum[k-1][i+1]++;    //右上

                sum[k][i+1]++;      //右

                sum[k+1][i+1]++;    //右下

                sum[k+1][i]++;      //下

                sum[k+1][i-1]++;    //左下

                sum[k][i-1]++;      //左

            }

            i++;

        }

        getchar();

        k++;

    }

    k = 1;while(k<=row){

        int i = 1;

        while(i<=line){

            if(alp[k][i]=='*'){

                putchar('*');

            }else if(alp[k][i]=='?'){

                printf("%d",sum[k][i]);

            }

            i++;

        }

        putchar('\n');

        k++;

    }

}

————————

27f14ecea1097076f6b9ddfa2eadf2bf.png

题4:简言之,给你个矩形的一堆字母,判断多少个2*2矩阵里的内容包含'f' 'a' 'c' 'e'四个字母。输出这个数。

看到这题最先想到的就是循环判断所有的2*2矩阵,把四个字母加起来,看值和f+a+c+e是不是相等(ASCII码相加),可是显然这是十分不严谨的。比如:f+a+c+e==e+b+d+d...后来去群里请教别人,别人说,相乘。嗯...是比相加好多了...于是我就用了相乘的值是否相等来判断矩阵的内容是否等价...

代码如下:

————————

#include

int main(void){

    const int value = 'f'*'a'*'c'*'e';

    int add = 0;

    char alp[55][55]={0};

    int row,line;

    scanf("%d %d",&row,&line);

    getchar();

    int k = 1;

    while(k<=row){

        int i = 1;

        while(i<=line){

            alp[k][i]=getchar();

            i++;

        }

        getchar();

        k++;

    }

    k = 1;

    while(k

        int i = 1;

        while(i

            if((alp[k][i]*alp[k][i+1]*alp[k+1][i]*alp[k+1][i+1])==value)

                add++;

            i++;

        }

        k++;

    }

    printf("%d",add);

}

————————

后面的几道题就是那种注意细节就能过的题了,不多说了。牛客基础过关就到这了。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值