大致思路:尝试依次更改每个镜子的方向 如果成立就输出此镜子的序号
最终代码99行 能AC就行(
此写法有些略显繁琐 仅供于参考思路
#include
using namespace std;
const int N=210;
int n;
int mx, my;
vector ax, ay;
void f(vector &v)
{
sort(v.begin(), v.end());
v.resize(unique(v.begin(), v.end())-v.begin());
}
struct Node
{
int x=0, y=0, id=-1;
void f()
{
x=lower_bound(ax.begin(), ax.end(), x)-ax.begin()+1;
y=lower_bound(ay.begin(), ay.end(), y)-ay.begin()+1;
}
void input(int i)
{
cin>>y>>x;
id=i;
}
}pt[N];
const int D[4][2]={{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int T[2][4]={{3, 2, 1, 0}, {1, 0, 3, 2}};
bool rt[N];
int tag[N][N];
bool st[N][N][4];
bool solve()
{
memset(st, 0, sizeof st);
bool flag=false;
int d=1;
int x=pt[n+1].x, y=pt[n+1].y;
while(1)
{
if(x==pt[0].x && y == pt[0].y)
{
flag=true;
break;
}
if(xmx || ymy || st[x][y][d]) break;
st[x][y][d]=true;
if(tag[x][y]!=-1) d=T[tag[x][y]][d];
x+=D[d][0], y+=D[d][1];
}
return flag;
}
int main()
{
cin>>n;
pt[0].input(0);
for(int i=1; i>c;
rt[i]=(c=='/');
}
for(int i=0; i |