题解 P1529 【回家 Bessie Come Home】

这道题总体来说并不难,纯模拟即可。唯一的难点就是判断无解。

我想了挺久愣是没想到什么好办法。然后我就动了点歪脑筋。

我们先来看一下这份没有判断无解情况的代码(我把他命名为代码67)。(思路与其他题解大体相同的,泥萌看不懂的话也可以去看其他题解的注释,然后他们判断无解的部分先忽略掉。

#include <cstdio> #include <iostream> const int N = 12; const int dirx[]={-1,0,1,0}, diry[]={0,1,0,-1}; char g[N][N]; int nx,ny; int fx,fy; int fdir; int ndir; int step; bool in_side(int x,int y) { return (x>=1 && x<=10 && y>=1 && y<=10); } void Input() { std::ios::sync_with_stdio(false); for(int i=1; i<=10; i++) { for(int j=1; j<=10; j++) { std::cin>>g[i][j]; if(g[i][j] == 'F') { fx=i,fy=j; } if(g[i][j] == 'C') { nx=i,ny=j; } } } } void Solve() { while(fx != nx || fy != ny) { step++; if(!in_side(fx+dirx[fdir],fy+diry[fdir]) || g[fx+dirx[fdir]][fy+diry[fdir]] == '*') { fdir=(fdir+1)%4; } else { fx+=dirx[fdir],fy+=diry[fdir]; } if(!in_side(nx+dirx[ndir],ny+diry[ndir]) || g[nx+dirx[ndir]][ny+diry[ndir]] == '*') { ndir=(ndir+1)%4; } else { nx+=dirx[ndir],ny+=diry[ndir]; } } std::cout<<step; } int main(void) { Input(); Solve(); return 0; }

这份代码交上去是67分,TLE了三个点。

TLE而不是WA!原因显而易见:如果无解的话while循环会一直执行下去直到超时。

我们来分析一下这道题的性质:

  1. 如果有解就输出正确答案,如果无解就输出零
    • 不能超过时间限制
  2. 这道题有1.6kAC

从第三点,我们先肯定了这道题是可以AC的。

既可以AC,又不能超过时间限制。

我们就可以得出:如果一个数据在时间限制内得不到解,那这个数据一定无解! (当然,这个结论是在保证了代码67的时间按复杂度较优的情况下得出的。)

由这个结论我们进而可以推导出一个特别的无解判断方法:判断程序是否能在时间范围内得出解

我想到了两种方法:

第一种是分析程序的复杂度,然后从while循环的执行次数入手:

  • 代码67很明显是o(n)的。我们先贴一张图。

    很明显,如果while循环的执行次数超过了107,那就超时了。 于是只要在while循环里面加上一句if(step > 1e7) {printf("0");return ;}就完事了。

第二种是利用<ctime>这个库直接计算程序运行时间。但是我太菜了并不熟悉怎么用。有兴趣的同学自行百度咯。

于是我这不太正常的解法就AC了。

AC代码

#include <cstdio> #include <iostream> const int N = 12; const int dirx[]={-1,0,1,0}, diry[]={0,1,0,-1}; char g[N][N]; int nx,ny; int fx,fy; int fdir; int ndir; int step; bool in_side(int x,int y) { return (x>=1 && x<=10 && y>=1 && y<=10); } void Input() { std::ios::sync_with_stdio(false); for(int i=1; i<=10; i++) { for(int j=1; j<=10; j++) { std::cin>>g[i][j]; if(g[i][j] == 'F') { fx=i,fy=j; } if(g[i][j] == 'C') { nx=i,ny=j; } } } } void Solve() { while(fx != nx || fy != ny) { step++; if(!in_side(fx+dirx[fdir],fy+diry[fdir]) || g[fx+dirx[fdir]][fy+diry[fdir]] == '*') { fdir=(fdir+1)%4; } else { fx+=dirx[fdir],fy+=diry[fdir]; } if(!in_side(nx+dirx[ndir],ny+diry[ndir]) || g[nx+dirx[ndir]][ny+diry[ndir]] == '*') { ndir=(ndir+1)%4; } else { nx+=dirx[ndir],ny+=diry[ndir]; } if(step > 1e7) { printf("0"); return ; } } std::cout<<step; } int main(void) { Input(); Solve(); return 0; }

望题解过审。


__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17776983.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示