誕生日にもらった意外なもの

C言語でパズル的なものを作成していますが、
解らないことがありこちらで質問させていただきます。
何卒、よろしくお願いします。
―――――――――――――――――――


char list[7][7] = {
 {0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0},
 {0,0,0,0,1,0,0},
 {0,0,1,9,1,0,0},
 {0,0,0,1,1,0,0},
 {0,0,0,1,0,1,0},
 {0,0,0,0,0,0,0},
};
int result[7*7][2];// [n][0]=x, [n][1]=y


例えば、上記のような配列があり、
list[4][4]の位置から探索開始したとします。
(解り易くするため仮に'9'を指定しています)

このlist[4][4]から「上下左右」に調べ、
'1'があればそこから更に上下左右に調べるといった感じで、
'1'で繋がってる配列の要素番号を抜き出したいのです。
例えばlist[4][5]が'1'であるため、
次にlist[5][5]とlist[4][6]を調べます。
また、list[3][4]の上下左には'1'が無いのでこの配列の探索は終了となります。

上記例でいえば、'x'の点が求めたい要素番号に該当します。
char list[7][7] = {
 {0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0},
 {0,0,0,0,x,0,0},
 {0,0,x,9,x,0,0},
 {0,0,0,x,x,0,0},
 {0,0,0,x,0,1,0},
 {0,0,0,0,0,0,0},
};


このような処理をする上で、
何か良いアルゴリズム等は方法はないでしょうか?

A 回答 (1件)

#include <stdio.h>



#define FX 7
#define FY 7
#define SX 3
#define SY 3

void explore(char result[][FX], char list[][FX], int x, int y)
{
if(x < 0 || FX <= x) return;
if(y < 0 || FY <= y) return;
if(!list[y][x] || result[y][x]) return;
result[y][x] = 1;
explore(result, list, x, y - 1);
explore(result, list, x + 1, y);
explore(result, list, x, y + 1);
explore(result, list, x - 1, y);
return;
}

void print(char result[][FX], char list[][FX], int x, int y)
{
const char *s = "01x";
int i, j;

for(i = 0; i < FY; ++ i){
for(j = 0; j < FX; ++ j){
if(i == y && j == x) putchar('s');
else putchar(s[list[i][j] + result[i][j]]);
}
putchar('\n');
}
putchar('\n');
}

int main(void)
{
char list[FY][FX] = {{1,0,0,0,1,0,0},
{0,1,0,0,1,0,0},
{0,0,1,0,1,1,1},
{1,1,1,1,1,0,0},
{0,0,0,1,1,0,0},
{0,0,0,1,0,1,1},
{0,0,0,1,0,1,1}};
char result[FY][FX] = {0};

print(result, list, SX, SY);
explore(result, list, SX, SY);
print(result, list, SX, SY);
return 0;
}
    • good
    • 0
この回答へのお礼

思い通りの結果が得られました!
本当に感謝します、ありがとうございます。

お礼日時:2008/12/27 16:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報