【问题标题】:A random walk across 10x10?10x10 的随机游走?
【发布时间】:2013-12-22 15:27:36
【问题描述】:

这是我试图在 C 中解决的问题: http://i.stack.imgur.com/X70nX.png

我已经写了这段代码,但我不知道哪里出了问题。它没有给我任何输出,只是一个空屏幕!1

这是我的代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROW 10 
#define COL 10

#define RIGHT 0
#define UP  1
#define LEFT 2 
#define DOWN 3

int main(void)
{
    char mat[ROW][COL];
    bool try;
    int move, co, ro,letter;

//Filling the grid with "."
    for (ro = 0; ro < ROW; ro++)
    {
        for (co = 0; co < COL; co++)
            mat[ro][co] = '.';
    }

//Initial Values
    co = 0; ro = 0; mat[0][0] = 'A';


    srand((unsigned)time(NULL));

    for (letter = 1; letter < 26; letter++)
    {
        try = true;

        while (try)
        {
            move = rand() % 4;

            if ((move == RIGHT) && (co + 1 < COL) && (mat[ro][co+1]=='.'))
            {
                mat[ro][co + 1] = mat[ro][co] + 1;
                co++; try=false;
            }

            if ((move == UP) && (ro - 1 >= 0) && (mat[ro-1][co]=='.') )
            {
                mat[ro - 1][co] = mat[ro][co] + 1;
                ro--; try = false;
            }

            if ((move == LEFT) && (co - 1 >= 0) && (mat[ro][co-1]=='.'))
            {
                mat[ro][co - 1] = mat[ro][co] + 1;
                co--; try = false;
            }

            if ((move == DOWN) && (ro + 1 < ROW) && (mat[ro+1][co]=='.'))
            {
                mat[ro + 1][co] = mat[ro][co] + 1;
                ro++;
            }
        }
    }


//Printing The GRID
    for (ro = 0; ro < ROW; ro++)
    {
        for (co = 0; co < COL; co++)
            printf(" %c", mat[ro][co]);
        printf("\n");
    }

    return 0;
}

现在这里有一个关于同样问题的类似讨论:Random walk on 10x10 Array

但我仍然不知道我的代码有什么问题!!...请把我当作初学者。

修订: 这是考虑到 cmets 后的新版本:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROW 10 
#define COL 10

#define RIGHT 0
#define UP  1
#define LEFT 2 
#define DOWN 3

int main(void)
{
    char mat[ROW][COL];
    bool try;
    int move, co, ro,letter,blocked;

//Filling the grid with "."
    for (ro = 0; ro < ROW; ro++)
    {
        for (co = 0; co < COL; co++)
            mat[ro][co] = '.';
    }

//Initial Values
    co = 0; ro = 0; mat[0][0] = 'A';


    srand((unsigned)time(NULL));

    for (letter = 1; letter < 26; letter++)
    {
        try = true;
        blocked = 0;
        while (try)
        {
            move = rand() % 4;
            switch (move)
            {

            case RIGHT:
            {   if ((co + 1 < COL) && (mat[ro][co + 1] == '.'))
            {
                mat[ro][co + 1] = mat[ro][co] + 1;
                co++; try = false; break;
            }
            else { blocked++; break; }}

            case UP:
            {   if ((move == UP) && (ro - 1 >= 0) && (mat[ro - 1][co] == '.'))
            {
                mat[ro - 1][co] = mat[ro][co] + 1;
                ro--; try = false; break;
            }
            else { blocked++; break; }}

            case LEFT:
            {   if ((move == LEFT) && (co - 1 >= 0) && (mat[ro][co - 1] == '.'))
            {
                mat[ro][co - 1] = mat[ro][co] + 1;
                co--; try = false; break;
            }
            else { blocked++; break; }}

            case DOWN:
            {if ((move == DOWN) && (ro + 1 < ROW) && (mat[ro + 1][co] == '.'))
            {
                mat[ro + 1][co] = mat[ro][co] + 1;
                ro++; try = false; break;
            }
            else { blocked++; break; }}
            }
            if (blocked == 4)
            {try = false; letter=26;}
        }  

    }


//Printing The GRID
    for (ro = 0; ro < ROW; ro++)
    {
        for (co = 0; co < COL; co++)
            printf(" %c", mat[ro][co]);
        printf("\n");
    }

    return 0;
}

代码仅在某些时候有效,但在“Z”之后不会停止(应该是字母=26),

【问题讨论】:

  • 我不知道c(我知道Java),但你不必在最后关闭大括号吗? for 括号和int main 括号?
  • 一个错误是代码没有设置try = false在一步DOWN之后。结果,它永远不会认为它已经退了一步,并且在那之后总是会多走一步。这不是您的问题的原因 - 让自己陷入困境 - 但额外的步骤几乎肯定会使问题变得更糟。 [最初作为答案给出,但因为不是一个好的答案而移到这里]
  • 你是对的 (try=false) .. 我会考虑角落的事情
  • 我不认为你可以用名字 try 得到一个布尔值,同样用名字 if 或 while
  • 测试blocked == 4 不正确。您可能会多次选择相同的方向(想象生成 L,L,L,L),然后即使您可以继续,您也会结束步行。相反,您应该在开头添加一个测试,查看所有相邻单元格,如果至少有一个点可用,则继续。

标签: c arrays


【解决方案1】:

代码有时有效。我认为您经常会陷入无限循环,因为您会生成无法继续的随机游走。像这样:

A B C .
H I D .
G F E .
. . . .

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多