简单思维题,想得到秒A,想不到打死算不出

可以想到,在本题中:
能从任意点到达任意点,等价于能从最外围的一圈(第0,n-1列和第0,m-1行)上的任意点到达最外围一圈上的任意点

说明:
如果想去(i, j)只需要先移动到(i, 0)或(i, n-1),然后纵向到达(i, j)
或是先移动到(0, j)或(m-1, j)然后横向到达
同样,想从(i, j)出发到任意点,只需要先到(i, 0)(i, n-1)(0, j)(m-1, j)这四个点其中之一,然后重复上面的步骤即可
题目显然保证对于任意一点都一定会有向上或向下,向左或向右的一个路径存在,所以上述方法是成立的

然后想要在最外围一圈的任意点到达任意点,就必须满足4个角落上的点一定不能是“死路”,所以最外围一圈的前进方向必须是顺时针或逆时针,即:

s[0] == t[0] && s[n-1] == t[m-1] && s[0] != s[n-1]

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
char s[maxn], t[maxn];
int main() {
    int T; cin>>T;
    while(T--) {
        int n, m; cin>>n>>m;
        cin>>s>>t;
        if(s[0] == t[0] && s[n-1] == t[m-1] && s[0] != s[n-1])
            cout<<"Happy"<<endl;
        else
            cout<<"Sad"<<endl;
    }
    return 0;
}