• ベストアンサー

プログラミング

またまた失礼します。 n×nの正方形の地図があるとします。地図の周囲を海とみなして海と隣接している水を表す点(湖、川)を海の点に変換するプログラムを作成したいのですが、勉強不足なのか、なかなかC言語プログラムを組めません。 実行例を示しますと、(陸→#、水→+、海→ー)  ++###+###+  #####+##+#  #######+##  ###++++###  ###+#+####  ###+++####  ######++##  #++++##++#  #+##+###++  ####+##### という地図が…  ーー###ー###ー  #####ー##+#  #######+##  ###++++###  ###+#+####  ###+++####  ######ーー##  #ーーーー##ーー#  #ー##ー###ーー  ####ー##### といった地図に変換したいんです。これが解ける方、いらっしゃいますか?いらっしゃったら、どうか教えてください。最初の地図は指定しても、しなくてもかまいません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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; }

kozukozuhito
質問者

お礼

ありがとうございました

その他の回答 (1)

  • ryuta_mo
  • ベストアンサー率30% (109/354)
回答No.1

上の辺、右の辺、下の辺、右の辺の各点について調べ、もし水だったらその座標を関数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); }

kozukozuhito
質問者

お礼

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