蓝桥杯 Cat And Mouse

猫和老鼠在10×10的方格中运动(如图3-6),例如: *...*..... ......*... ...*...*.. .......... ...*.C.... *.....*... ...*...... ..M......* ...*.*.... .*.*...... C=猫(CAT) M=老鼠(MOUSE) *=障碍物 .=空地 猫和老鼠每秒中走一格,如果在某一秒末它们在同一格中,我们称它们“相遇”。 注意:“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1秒的时间做一个右转90°。一开始它们都面向北方。 编程计算多少秒以后他们相遇。

#include <bits/stdc++.h> using namespace std; #define ri register int #define M 100005 struct dian{ int x,y,f; }a,b; int p[15][15]; void zou(dian &t) { if(t.f==0) { if(p[t.y-1][t.x]==1||t.y==1) { t.f++; } else { t.y--; } return ; } if(t.f==1) { if(p[t.y][t.x+1]==1||t.x==10) { t.f++; } else { t.x++; } return ; } if(t.f==2) { if(p[t.y+1][t.x]==1||t.y==10) { t.f++; } else { t.y++; } return ; } if(t.f==3) { if(p[t.y][t.x-1]==1||t.x==1) { t.f=0; } else { t.x--; } return ; } } int main(){ for(ri i=1;i<=10;i++) for(ri j=1;j<=10;j++) { char c; cin>>c; if(c=='*') { p[i][j]=1; } if(c=='.') continue; if(c=='C') { a.x=j; a.y=i; } if(c=='M') { b.x=j; b.y=i; } } int cent=0; while(1) { cent++; zou(a); zou(b); if(a.x==b.x&&a.y==b.y) { printf("%d\n",cent); break; } } return 0; }