またまた失礼します。
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;
}
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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 地震・津波 1973年の映画『日本沈没』の冒頭の黙示録(数億年間の大陸の移動)は大地震発生地域だったらしい? 1 2023/02/10 20:18
- Excel(エクセル) エクセルの値を元に図形の色を変えたい 2 2022/05/11 01:37
- その他(社会・学校・職場) 俺は、終了? 東海道新幹線に飛び込み間近? 2 2022/09/05 20:24
- 地理学 「Yahoo!天気」の「雨雲レーダー」の地図の海岸線の陸側はクリーム色です。また、海岸線の点線は 2 2023/08/23 20:10
- 登山・トレッキング ちゃんと読図を基本から学んだ人って、地形図と現実の地形を照合して現在位置を特定できるのですか? 4 2023/04/15 17:48
- 数学 『4色問題③』 2 2022/11/14 00:31
- カラオケ 森昌子 『立待岬』の歌詞では露国侵攻と千島海溝地震の被災地を表現していますが、私の解釈如何ですか? 4 2023/03/13 11:49
- 地理学 地形図を買うのでおすすめの地域(国内)を教えてください 2 2022/05/11 19:22
- 東海 中央アルプスと美濃三河高原 2 2022/05/25 07:09
- 地理学 ロシア タタルスタン共和国の地理について 2 2022/05/24 21:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
再起呼び出しの回数をカウント...
-
直線補間について
-
素数のプログラムについて教え...
-
C#メール受信から件名、本文を...
-
PIC16F88マイコンのC言語プログ...
-
漸化式:nCrの計算(C言語)
-
OpenCVによる4値化について
-
異なるn個の整数からr個の整数...
-
【C#】SQL文の中に変数を埋め込...
-
c言語プログラミングについて f...
-
迷路の解を見つけるアルゴリズム
-
コマンドプロンプトのウィンド...
-
Cプログラムによる画像の高速フ...
-
2次関数プログラムを描写する...
-
強連結判定を行うプログラムに...
-
コマンドプロンプトを使用して...
-
ヌメロンのプログラム
-
【C言語教えてください】sin波...
-
2÷3などの余りについて
-
C言語についてです。 アスタリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
迷路を脱出する経路探索プログ...
-
画像の拡大・縮小
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++で表を作成したいのです ...
-
条件が多い場合
-
複数の共有メモリの作成
-
ヒストグラム均等化処理プログラム
-
3のつく数と3の倍数を表示 C言語
-
argvのNULLチェック
-
乱数で交互に偶数、奇数が、、、。
-
プログラミングに関して
-
OpenCVによる4値化について
-
whileとifを使い偶数を出すには
-
16bitで乱数を生成する方法
-
再帰処理をループ処理に変換
おすすめ情報