-1

私は一日中取り組んできたプログラムを持っています。プログラムは何度もフリーズし、フリーズしません....フリーズしないときは正常に動作し、次のようになります... http://picpaste.com/Multidimensional_Array-KfdKSmoE.bmp

開いたときにハングアップすると、次のようになります... http://picpaste.com/Multidimensional_Array_hung-Jcmz0rQP.bmp

// Chapter 8 Programming Project #9

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 10
#define PATH_SIZE 25
#define ROW_SIZE ((int) (sizeof(board) / sizeof(board[0])))

int main(void)
{
    char board[SIZE][SIZE] = {};
    // 0 = Up, 1 = Down, 2 = Left, 3 = Right
    unsigned short i = 0, x, y;
    // Generate a random number
    srand((unsigned) time(NULL));
    int dir = rand() % 4;
    // Set all positions of board to '.'
    for (x = 0; x < ROW_SIZE; x++) {
        for (y = 0; y < ROW_SIZE; y++)
            board[x][y] = '.';
    }
    x = 0;
    y = 0;
    board[0][0] = 'A';
    // Generate the path
    while (i != PATH_SIZE) {
        for (i = 0; i < PATH_SIZE;) {
            // Check the direction and replace that char
            switch (dir) {
                case 0: if ((y - 1) >= 0 && (y - 1) < ROW_SIZE
                            && board[x][y - 1] == '.') {
                    board[x][--y] = i + 'B';
                    ++i;
                } break;
                case 1: if ((y + 1) >= 0 &&(y + 1) < ROW_SIZE
                            && board[x][y + 1] == '.') {
                    board[x][++y] = i + 'B';
                    ++i;
                } break;
                case 2: if ((x - 1) >= 0 && (x - 1) < ROW_SIZE
                            && board[x - 1][y] == '.') {
                    board[--x][y] = i + 'B';
                    ++i;
                } break;
                case 3: if ((x + 1) >= 0 && (x + 1) < ROW_SIZE
                            && board[x + 1][y] == '.') {
                    board[++x][y] = i + 'B';
                    ++i;
                } break;
            }
        // Reset the random direction
        dir = rand() % 4;
        }
    }
    // Print the board
    for (x = 0; x < ROW_SIZE; x++) {
        for (y = 0; y < ROW_SIZE; y++)
            printf("%c ", board[x][y]);
        printf("\n");
    }

    return 0;
}
4

2 に答える 2

2

これは、移動できる方向がない場合にハングします。4 x 4 のボードの簡単な例を取り上げます。最初は、ボードは次のようになります。

....
....
....
....

マーキングされた初期位置

A...
....
....
....

私は最初の動きをします、私は右に移動すると言います

AB..
....
....
....

私は次の動きをします、私が下に移動すると言います

AB..
.C..
....
....

私は次の動きをします、私が下に移動すると言います

AB..
.C..
.D..
....

私は次の動きをします、左に移動すると言います

AB..
.C..
ED..
....

私は次の動きをします、私が上に移動すると言います

AB..
FC..
ED..
....

そして、私は立ち往生しており、移動できる場所がありません。さらにいくつか追加すると、問題が解決します。

  1. 可能な移動方向のリストを計算するメソッドを追加します
  2. これ以上移動できない場合は、プログラムを終了します

ヒント

void calc_poss_dirs()
{
        int dir;

        poss_dir.count = 0;

        for (dir = UP; dir <= RIGHT; dir++) {
                if (can_move(dir)) {
                        poss_dir.dirs[poss_dir.count] = dir;
                        poss_dir.count++;
                }
        }
}
int can_move(int dir)
{
        int x = cur_x;
        int y = cur_y;

        if (dir == UP)
                x--;
        else if (dir == DOWN)
                x++;
        else if (dir == LEFT)
                y--;
        else
                y++;

        if (!in_area(x, y))
                return 0;

        if (visited(x, y))
                return 0;

        return 1;
}
于 2014-03-11T09:37:22.023 に答える
0

Sakthi Kumar に感謝します。あなたの入力は非常に貴重でした。私が感謝するのを手伝ってくれた他のすべてのあなたと同様に、実際のコードは以下のとおりです:)

    // Chapter 8 Programming Project #9

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <time.h>

    #define SIZE 10
    #define PATH_SIZE 25
    #define ROW_SIZE ((int) (sizeof(board) / sizeof(board[0])))

    int main(void)
    {
        char board[SIZE][SIZE];
        // 0 = Up, 1 = Down, 2 = Left, 3 = Right
        unsigned short i = 0, x, y;
        // Generate a random number
        srand((unsigned) time(NULL));
        int dir = rand() % 4;
        // Set all positions of board to '.'
        for (x = 0; x < ROW_SIZE; x++) {
            for (y = 0; y < ROW_SIZE; y++)
                board[x][y] = '.';
        }
        x = 0;
        y = 0;
        board[0][0] = 'A';
        // Generate the path
        for (i = 0; i < PATH_SIZE;) {
                // Check that the last character has not been cornered
            if ((board[x][y - 1] != '.' || y - 1 < 0) &&
                (board[x][y + 1] != '.' || y + 1 > ROW_SIZE) &&
                (board[x - 1][y] != '.' || x - 1 < 0) &&
                (board[x + 1][y] != '.' || x + 1 > ROW_SIZE))
                break;
            // Check the direction and replace that char
            switch (dir) {
                case 0: if ((y - 1) >= 0
                            && board[x][y - 1] == '.') {
                            board[x][--y] = i + 'B';
                            ++i;
                        } break;
                case 1: if ((y + 1) < ROW_SIZE
                            && board[x][y + 1] == '.') {
                            board[x][++y] = i + 'B';
                            ++i;
                        } break;
                case 2: if ((x - 1) >= 0
                            && board[x - 1][y] == '.') {
                            board[--x][y] = i + 'B';
                            ++i;
                        } break;
                case 3: if ((x + 1) < ROW_SIZE
                            && board[x + 1][y] == '.') {
                            board[++x][y] = i + 'B';
                            ++i;
                        } break;
                default: if (board[x][y] == '.')
                             board[x][y] = i + 'B';
                             break;
            }
        // Reset the random directions
        dir = rand() % 4;
        }
        // Print the board
        for (x = 0; x < ROW_SIZE; x++) {
            for (y = 0; y < ROW_SIZE; y++)
                printf("%4c ", board[x][y]);
            printf("\n");
        }

        return 0;
    }
于 2014-03-13T06:11:56.930 に答える