問題をといていて、コンパイルはできたのですが、自分の思ったような出力が得られないので、ご教授いただきたいです。
問題
内部が格子状の正方形の区画に分けられ、一部の区画に鏡が配置された箱を考えます。
今、その箱を上部から眺めているものとし、箱の高さは考えないことにします。
鏡は区画の対角線上に配置され、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の中のどこかが悪いのでしょうが原因がわかりません。
どうかよろしくお願いいたします。