アプリ版:「スタンプのみでお礼する」機能のリリースについて

またまた失礼します。
n×nの正方形の地図があるとします。地図の周囲を海とみなして海と隣接している水を表す点(湖、川)を海の点に変換するプログラムを作成したいのですが、勉強不足なのか、なかなかC言語プログラムを組めません。
実行例を示しますと、(陸→#、水→+、海→ー)

 ++###+###+
 #####+##+#
 #######+##
 ###++++###
 ###+#+####
 ###+++####
 ######++##
 #++++##++#
 #+##+###++
 ####+#####

という地図が…

 ーー###ー###ー
 #####ー##+#
 #######+##
 ###++++###
 ###+#+####
 ###+++####
 ######ーー##
 #ーーーー##ーー#
 #ー##ー###ーー
 ####ー#####

といった地図に変換したいんです。これが解ける方、いらっしゃいますか?いらっしゃったら、どうか教えてください。最初の地図は指定しても、しなくてもかまいません。

A 回答 (2件)

ANo.1さんのコーディング例。



#include <stdio.h>
#define XSIZE 10
#define YSIZE 10
int map[YSIZE][XSIZE]={1,1,2,2,2,1,2,2,2,1,
            2,2,2,2,2,1,2,2,1,2,
            2,2,2,2,2,2,2,1,2,2,
            2,2,2,1,1,1,1,2,2,2,
            2,2,2,1,2,1,2,2,2,2,
            2,2,2,1,1,1,2,2,2,2,
            2,2,2,2,2,2,1,1,2,2,
            2,1,1,1,1,2,2,1,1,2,
            2,1,2,2,1,2,2,2,1,1,
            2,2,2,2,1,2,2,2,2,2};
char sym[3][3]={"-","+","#"};

void disp_map(void) {
 int i,j;
 for (i=0;i<YSIZE;i++) {
  for (j=0; j<XSIZE; j++) {
   printf("%s",sym[map[i][j]]);
  }
  printf("\n");
 }
 printf("\n");
}

void henkan(int x, int y) {
 if (map[y][x]==2) return; /* 陸なら何もしない */
 if (map[y][x]==1) {
  map[y][x]=0; /* 海に変える */
  if (x>0) henkan(x-1,y); /* 左を調べる */
  if (x<XSIZE-1) henkan(x+1,y); /* 右を調べる */
  if (y>0) henkan(x,y-1); /* 上を調べる */
  if (y<YSIZE-1) henkan(x,y+1); /* 下を調べる */
 }
}

int main(void) {
 int i;
 disp_map();
 for (i=0;i<XSIZE;i++) {
  henkan(i, 0); /* 上の辺 */
  henkan(i, YSIZE-1); /* 下の辺 */
 }
 for (i=0;i<YSIZE;i++) {
  henkan(0,i); /* 左の辺 */
  henkan(XSIZE-1,i); /* 右の辺 */
 }
 disp_map();
 return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2004/12/12 20:57

上の辺、右の辺、下の辺、右の辺の各点について調べ、もし水だったらその座標を関数fに送る(名前は何でもよい)



関数fでは送られた座標の部分を海に変え上下左右座標が水だったらその座標を関数fに送る。
関数の中で自分自身を呼び出すのを再帰呼び出しといいます。
このアルゴリズムは塗りつぶしのアルゴリズムと同じです。
再帰呼び出し、塗りつぶしで検索すればもっとわかりやすい解説があります。

関数fの例
void f(int x,int y) {
map[x][y]=MAP_SEE;
if (map[x][y-1]==MAP_WATER) /*下*/
f(x,y-1);
if (map[x+1][y]==MAP_WATER) /*右*/
f(x+1,y);
if (map[x][y+1]==MAP_WATER) /*上*/
f(x,y+1);
if (map[x-1][y]==MAP_WATER) /*左*/
f(x-1,y);
}
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2004/12/12 20:55

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