ビームが反射する箱

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kenji3448

ビームが反射する箱

#1

投稿記事 by kenji3448 » 8年前

おはようございます
問題をといていて、コンパイルはできたのですが、自分の思ったような出力が得られないので、ご教授いただきたいです。

問題
内部が格子状の正方形の区画に分けられ、一部の区画に鏡が配置された箱を考えます。
今、その箱を上部から眺めているものとし、箱の高さは考えないことにします。
鏡は区画の対角線上に配置され、1つの区画には1枚の鏡を配置することができます。

さて、箱の左上の区画に対し、箱の左側の外部から箱の内部に向けてビームを撃つことを考えます。
まず、ビームは右に向かって真っ直ぐ飛び、鏡がない区画は通過します。
鏡がある区画に入るとビームは鏡の向きに従って反射し、90°角度を変えて同様に進み、反射後も必ず真っ直ぐ進みます。
また、ビームは箱の外周上に到達すると外へ飛び出すようになっており、箱の内部に打ち込まれた後、外部に飛び出るまで反射を続け飛び回ります。
鏡のない区画を'_' 、端点が区画の右上および左下の頂点であるような対角線の上に配置された鏡を'/'、もう一方の対角線上に配置された鏡を'\' で表すこととする。
箱の高さHと幅W、および箱の内部の状態が与えられるので、箱の内部に向けてビームが撃たれてから箱の外部に飛び出るまでにビームが箱の中の区画を通過する回数を答えてください。

コード:

#include <stdio.h>

int main(void) {
	int tate,yoko,ans,ta,yo,hou=1;//部屋の形読み取り
	char mozi[110][110];
	scanf("%d",&tate);
	scanf("%d",&yoko);
	for(int i=0;i<tate;i++){
		scanf("%s",mozi[i]);
	}
//部屋を正しく読みとれているか確認
	for(int i=0;i<tate;i++){
		for(int j=0;j<yoko;j++){
			printf("%c",mozi[i][j]);
		}
		printf("\n");
	}
//ansは通った部屋数、ta,yoはそれぞれ現在の部屋の縦横の座標
	ans=0;
	ta=0;
	yo=0;
//houはレーザーの進行方向、1が右、2は下、3は左、4は上
	while((0<=ta&&ta<tate)&&(0<=yo&&yo<yoko)){
		if(mozi[ta][yo]=='/'){
			if(hou==1)hou=4;
			if(hou==4)hou=1;
			if(hou==2)hou=3;
			if(hou==3)hou=2;
		}else if(mozi[ta][yo]=='\\'){
			if(hou==1)hou=2;
			if(hou==4)hou=3;
			if(hou==3)hou=4;
			if(hou==2)hou=1;
		}
		ans+=1;
			if(hou==1)yo+=1;
			if(hou==4)ta-=1;
			if(hou==2)ta+=1;
			if(hou==3)yo-=1;
		printf("縦%d横%d方向%d\n",ta,yo,hou);//確認	
	}
	printf("%d\n",ans);
	return 0;
}
 


入力
3 5
__\_/
___/_
\/\_/

出力
__\_/
___/_
\/\_/
縦0横1方向1
縦0横2方向1
縦0横3方向1
縦0横4方向1
縦0横5方向1
5

部屋の形は正しく読めていますが、方向が常に1のままで困っています。
whileの中のどこかが悪いのでしょうが原因がわかりません。
どうかよろしくお願いいたします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ビームが反射する箱

#2

投稿記事 by みけCAT » 8年前

mozi[ta][yo]=='/'のとき、
if(hou==1)hou=4;でhouを4にしても、if(hou==4)hou=1;ですぐに1に戻ってしまいます。
mozi[ta][yo]=='\\'のときも、同様にif(hou==1)hou=2;→if(hou==2)hou=1;で1のままです。
  • else if
  • switch
  • 今の値番目に次の値が格納された配列
などのいずれかを用いて、houを1ループにつき高々1回だけ更新するようにすると良さそうです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kenji3448

Re: ビームが反射する箱

#3

投稿記事 by kenji3448 » 8年前

よく分かりました!
みけcatさんありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る