K. Escape from the Abundoned House
广搜,我们只关心从s到f的路径,无论长短
题意:
一个房间被分为n*m个空间,空间由s,f,‘#’,‘.’组成,只能走‘.’,可以重复走某一个点,走列温度升高1,走行温度降低1,若不能从s到f则输出-1,可以则输出初始温度和结尾温度的差值(初始为0).
思路
如果能走到,答案应该是两点🔺x和▲y的差值。但既然可以重复走某个点,即当存在列或行可以走的时候,可以重复走以减少温度的差值(走回去再走回来,减少的值一定是2的倍数,所以答案只可能是1或0),可是当只有列或者行时,就不行了,答案即为原来的数。
#include<bits/stdc++.h> using namespace std; char a[1005][1005]; typedef pair<int,int>PII; int vis[1005][1005]; #define fi first #define se second signed main() { PII st,end; int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]=='s') { st.fi=i; st.se=j; } else if(a[i][j]=='f') { end.fi=i; end.se=j; } } } queue<PII>que; que.push(st); vis[st.fi][st.se]=1; int is_x=0,is_y=0; //是否只在x和y方向上移动,若只在一个方向上移动,则不会发生降温或者升温 int flag=0; //可以到达终点 int d1[]={1,0,-1,0}; int d2[]={0,1,0,-1}; while(que.size()) { PII temp=que.front(); que.pop(); for(int i=0;i<4;i++) { int x=temp.fi+d1[i]; int y=temp.se+d2[i]; if(1<=x&&x<=n&&1<=y&&y<=m&&a[x][y]!='#'&&vis[x][y]==0) { if(d1[i]!=0) is_x=1; if(d2[i]!=0) is_y=1; que.push({x,y}); vis[x][y]=1; if(x==end.fi&&y==end.se) { flag=1;//可以到达 } } } } if(flag) { int ans=abs(-abs(end.se-st.se)+abs(end.fi-st.fi)); //确定最小差异 if(is_x&&is_y) { if(ans%2) //小细节 { cout<<1; }else { cout<<0; } }else { cout<<ans; } }else { cout<<-1; } }
本文作者:TimMCBen
本文链接:https://www.cnblogs.com/TimMCBen/p/16045294.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步