实验仓 #779.【CSP2019模拟 Day 1】A题
考场上面做了一个暴力的做法,然后,然后他了。
emmm...(就算了吧,了算什么事啊)
好吧,这道题,其实好像...是一道思维题来着。
如果出现了这样两个打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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现