注册 登录
编程论坛 C语言论坛

C语言数组问题.实在不会了.图片是拍的请见谅.

Niderhoger 发布于 2020-03-30 17:35, 3147 次点击
只有本站会员才能查看附件,请 登录
14 回复
#2
wmf20142020-03-30 17:56
简单是简单,可是论坛不提倡帮做作业的,好歹你写个框架啊。
#3
lin51616782020-03-30 17:58
当前坐标 x y
表示当前走到了 map[x][y] 这个位置
向上走 map[x-1][y]
向下走 map[x+1][y]
向左走 map[x][y-1]
向右走 map[x][y+1]
比较简单的这里你用switch处理就完事了
注意 边界检查就差不多了
#4
Niderhoger2020-03-30 21:11
回复 3楼 lin5161678
关键是怎么去检查边界...这一步不会
#5
Niderhoger2020-03-30 21:13
回复 3楼 lin5161678
因为我的代码是先移动的,它会移动到索引为-1的地方,这就直接异常了
#6
Niderhoger2020-03-30 21:14
回复 2楼 wmf2014
..对不起 忘了说了
我就是那个变界检查不会 怎么让我的移动不会走出那个10×10的空间

我想过声明一个12×12的 但是太麻烦了
#7
forever742020-03-30 21:23
你都说了,先移动有问题,那就先检查后移动呗。
#8
wmf20142020-03-30 21:30
如果不用递归做的话,移动前应先保存当前坐标,移动后发现坐标异常就恢复,正常则继续。递归做则原坐标在栈中,返回就行了。
#9
Niderhoger2020-03-31 19:47
回复 8楼 wmf2014
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

void chuShiHua(char qiPan[][12], bool panDuan[][12]);
int suiJiShu(void);
bool jianCha(bool panDuan[][12], char ziMu);
void yiDong(bool panDuan[][12], char qiPan[][12]);
void daYin(char qiPan[][12]);

int hang = 1, lie = 1;
char ziMu = 'A';

int main(void)
{
    char qiPan[12][12];
    bool panDuan[12][12];


    srand((unsigned)time(NULL));
    chuShiHua(qiPan, panDuan);

    qiPan[1][1] = ziMu;
    panDuan[1][1] = true;

    while (jianCha(panDuan, ziMu))
        yiDong(panDuan, qiPan);

    daYin(qiPan);

    return 0;
}

/* 初始化数组 */
void chuShiHua(char qiPan[][12], bool panDuan[][12])
{
    for (int x = 0; x < 12; x++)
        for (int y = 0; y < 12; y++)
            qiPan[x][y] = '.';

    for (int x = 0; x < 12; x++)
        for (int y = 0; y < 12; y++)
            if (x == 0 || y == 0 || x == 11 || y == 11)
                panDuan[x][y] = true;
            else
                panDuan[x][y] = false;
}

/* 生成随机数 */
int suiJiShu(void)
{
    return rand() % 4;
}

/* 判断,如果能继续则返回true;不能继续则返回false */
bool jianCha(bool panDuan[][12], char ziMu)
{
    if (ziMu == 'Z')
        return false;
    if (panDuan[hang - 1][lie] && panDuan[hang + 1][lie])
        if (panDuan[hang][lie - 1] && panDuan[hang][lie + 1])
            return false;

    return true;
}

/* 利用随机数进行方向的移动 */
void yiDong(bool panDuan[][12], char qiPan[][12])
{
    bool zuobiao = true;
    switch (suiJiShu())
    {
    case 0:hang--;
        if (panDuan[hang][lie])
        {
            hang++;
            zuobiao = false;
        }
        break;
    case 1:lie++;
        if (panDuan[hang][lie])
        {
            lie--;
            zuobiao = false;
        }
        break;
    case 2:hang++;
        if (panDuan[hang][lie])
        {
            hang--;
            zuobiao = false;
        }
        break;
    case 3:lie--;
        if (panDuan[hang][lie])
        {
            lie++;
            zuobiao = false;
        }
        break;
    }

    if (zuobiao)
    {
        ziMu++;
        qiPan[hang][lie] = ziMu;
        panDuan[hang][lie] = true;
    }
}

/* 打印 */
void daYin(char qiPan[][12])
{
    for (int x = 1; x < 11; x++)
    {
        for (int y = 1; y < 11; y++)
            putchar(qiPan[x][y]);
        putchar('\n');
    }
        
}


我成功了 不过不是声明的10×10数组 ,而是12×12  
#10
wmf20142020-03-31 20:44
回复 9楼 Niderhoger
恭喜楼主!
那我也给出我用递归完成的代码,供楼主参考。只要修改“#define N 10”为“#define N 12”,就可以做12×12:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int aaaa(char a[][N], int x, int y, char c)
{
    int i, j, k;
    if (x < 0 || y < 0 || x>N-1 || y>N-1 || a[x][y])return 0;  //坐标越界或坐标点上已经有字母则返回0
    a[x][y] = c;
    if (c == 'Z')return 1;    //26个字母全部用完返回1
    j = rand() % 4;
    for (i = 0; i < 4; i++)
    {
        k = ((i + j) % 4) * 2 + 1;
        if (aaaa(a, x + k % 3 - 1, y + k / 3 - 1, c + 1))return 1;  //步进递归
    }
    return 1;                //无路可走返回1
}
void main()
{
    int i, j;
    char a[N][N] = { 0 };
    srand(clock());
    aaaa(a, 0, 0, 'A');
    for (i = 0; i < N; i++, printf("\n"))
        for (j = 0; j < N; j++)
            if (a[i][j])printf("%c", a[i][j]);
            else printf(".");
    system("pause");
}
#11
lin51616782020-03-31 20:59
以下是引用wmf2014在2020-3-31 20:44:48的发言:

恭喜楼主!
那我也给出我用递归完成的代码,供楼主参考。只要修改“#define N 10”为“#define N 12”,就可以做12×12:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int aaaa(char a[][N], int x, int y, char c)
{
    int i, j, k;
    if (x < 0 || y < 0 || x>N-1 || y>N-1 || a[x][y])return 0;  //坐标越界或坐标点上已经有字母则返回0
    a[x][y] = c;
    if (c == 'Z')return 1;    //26个字母全部用完返回1
    j = rand() % 4;
    for (i = 0; i < 4; i++)
    {
        k = ((i + j) % 4) * 2 + 1;
        if (aaaa(a, x + k % 3 - 1, y + k / 3 - 1, c + 1))return 1;  //步进递归
    }
    return 1;                //无路可走返回1
}
void main()
{
    int i, j;
    char a[N][N] = { 0 };
    srand(clock());
    aaaa(a, 0, 0, 'A');
    for (i = 0; i < N; i++, printf("\n"))
        for (j = 0; j < N; j++)
            if (a[j])printf("%c", a[j]);
            else printf(".");
    system("pause");
}

有一点值得一提
clock() 返回的是程序运行时间
因为这里在程序刚刚开始的时候 调用 前面基本什么事情都没做
这个返回值大概率是0
这个用法不是一个合适的做法
#12
wmf20142020-03-31 21:09
回复 11楼 lin5161678
谢谢!
平时用它计时用多了,真没深究,一直以为就是开机以来流失的时间。
#13
你们都要疼我哦2020-04-01 02:40
小哥哥很讲卫生嘛,指甲修剪的很好
#14
lin51616782020-04-01 07:19
回复 13楼 你们都要疼我哦
阴阳怪气
#15
你们都要疼我哦2020-04-01 12:44
在不被人关注的角落 发现美。 指甲真的很短 很好 很卫生
1