考场上面做了一个暴力的做法,然后,然后他$WA$了。
emmm...($T$就算了吧,$WA$了算什么事啊)
好吧,这道题,其实好像...是一道思维题来着。

如果出现了这样两个打X的格子上的字符相同,那么全局则一定有两条以上的字符串一样的路。因为从(1,1)有一条路到左上角,左上角到右下角分别经过两个打X的格子到右下角,最后再从右下角随便找一条路到(n,m)就可以了。
简单证明一下如果没有出现这种情况,一定不会有两条不同的路符合条件。假设已经走到了某一个点,因为只能往右或者往下走,如果那两个位置不一样,形成的字符串就一定会是不一样的。
简单实现的话,直接判断有没有这种情况出现就好了。但是和大佬学习了一下,用了一个递推(类似dp?)的做法。

1 #include<iostream>
2 #include<string>
3 #include<cstdio>
4 #include<cstring>
5 #include<map>
6 #include<algorithm>
7 using namespace std;
8 #define N 1005
9 #define ll long long
10 int n,m;
11 char mp[N][N];
12 int f[N][N];//f[i][j]01状态表示(i,j)能否有2种及以上的方法到达
13 int main()
14 {
15 int T;scanf("%d",&T);
16 while(T--)
17 {
18 memset(f,0,sizeof(f));
19 scanf("%d %d",&n,&m);
20 for(int i=1;i<=n;i++)
21 scanf("%s",mp[i]+1);
22 for(int i=1;i<=n;i++)
23 for(int j=1;j<=m;j++)
24 {
25
26 f[i][j]|=f[i-1][j]|f[i][j-1];
27 //如果到这两个格子有两种及以上走法,那么到这一个格子也肯定有
28 if(i>1&&j>1)
29 f[i][j]|=(mp[i-1][j]==mp[i][j-1]);
30 //如果这两个格子一样,那么可以从(i-1,j-1)走到这两个格子,再走到(i,j),有2种走法
31 }
32 if(f[n][m]) puts("Yes");
33 else puts("No");
34 }
35 return 0;
36 }
