迷路を駆け抜けろ | spin on the RITZ

迷路を駆け抜けろ

迷路を解くよ!



spin on the RITZ-迷路


S - スタート地点

G - ゴール地点

□ - 通った通路

■ - 壁


右手で壁をつたいながら移動していっている(はず!)

ちょっとした頭の体操にはもってこいですね。


マップの作り方によってはセグメントエラーが起きる。

あとで直す。多分。



map.txtの内容

最初の2つの数 -- 横幅 縦幅
0 - 通路

1 - スタート

2 - ゴール

3 - 壁



以下ソース

#include <stdio.h>
#include <string.h>

char map[50][50];
int width, height;

void read_map(void)
{
    FILE* map_file;
    char buf[30];
    int w, h;

    map_file = fopen("map.txt", "r");
    if (map_file == NULL) {
        printf("map.txt が開けませんでした.\n");
        exit(1);
    }

    memset(map, '3', sizeof(map));
    fgets(buf, sizeof(buf), map_file);
    sscanf(buf, "%d %d", &width, &height);
    for (h = 1;h <= height;h++)
        fgets(map[h]+1, sizeof(map[h]), map_file);
}

int calc(void)
{
    int x, y, dir = 2;
    int i, j;
    int dx[] = {0, -1, 0, 1};
    int dy[] = {-1, 0, 1, 0};

    for (i = 0;i < height;i++) {
        for (j = 0;j < width;j++) {
            if (map[i][j] == '1') {
                x = j;
                y = i;
            }
        }
    }
    
    while (1) {
        for (int i=0;i < 4;i++) {
            if (map[y+dy[(dir+3)%4]][x+dx[(dir+3)%4]] != '3') {
                dir = (dir+3)%4;
                break;
            } else if (map[y+dy[dir]][x+dx[dir]] != '3') {
                break;
            } else {
                dir = (dir+1)%4;
            }
        }
        if (map[y][x] != '1')
            map[y][x] = '4';
        y = y + dy[dir];
        x = x + dx[dir];
        if (map[y][x] == '2')
            return 1;
        else if (map[y][x] == '1')
            return 0;
    }
}

int main(void)
{
    char *symbol[] = {"  ", "S", "G", "■", "□"};

    read_map();
    if (calc())
        printf("ゴール出来たみたいです.\n");
    else
        printf("ゴール出来ないみたいです.....\n");  

    for (int i=1;i <= height;i++) {
        for (int j=1;j <= width;j++) {
            printf("%s", symbol[map[i][j]-'0']);
        }
        printf("\n");
    }

    return 0;
}


//map.txt
35 21
31333333333333333333333333333333333
30300030000000003000300030003000003
30303030333333333030303330303330333
30303030000000003030303000300030003
30303033333333303033303033333033303
30003000000030003000303000003033303
33333333303030333330303033303033303
30000000303030000030303030003033303
30333330333033303030000030303033333
30300000300030003033333330303000003
30333333303330333033333330333333303
30000030300000300000000030000030003
30303030333333333333303333333030333
30303030000000300000000000003030003
30333030303330303333333333333030303
30003000300030300000000030000030303
33303333333030333333333030333333303
30003030000030300030003000300000303
30333030333330303030303033333330303
30000030000030003000300000000000303
33333333333333333333333333333333323



もっとすっきりしたソースを書きたい。 コメントがないのはご愛嬌