USACO Section 5.2 Snail Trail - 很水的枚举..

本文通过一个Snail迷宫问题介绍了深度优先搜索(DFS)算法的应用。文章详细解释了如何利用DFS来寻找迷宫中从起点到终点的最长路径,并通过C++代码实现了这一过程。特别注意到了路径结束的条件不仅是碰到自身,还包括被边界或者障碍物限制住的情况。



就按题目要求枚举出所有情况吧~~~就是从1,1开始DFS...值得注意的是其实一条路径结束的条件除了碰到自己~~还有就是被边境或#给夹得没地方去~~我就因为少考虑了这个WA了一次....


Program:

/* ID: zzyzzy12 LANG: C++ TASK: snail */ #include<iostream> #include<istream> #include<stdio.h> #include<string.h> #include<math.h> #include<stack> #include<map> #include<algorithm> #include<queue> #define oo 2000000005 #define ll long long #define pi (atan(2)+atan(0.5))*2 using namespace std; int n,arc[205][205],k,ans; int go[4][2]={{0,-1},{1,0},{0,1},{-1,0}}; void DFS(int y,int x,int face,int step) { if (step-1>ans) ans=step-1; if (arc[y][x]==1) { y-=go[face][1]; x-=go[face][0]; k=(face+1)%4; if (!arc[y+go[k][1]][x+go[k][0]]) DFS(y+go[k][1],x+go[k][0],k,step); k=(face+3)%4; if (!arc[y+go[k][1]][x+go[k][0]]) DFS(y+go[k][1],x+go[k][0],k,step); return; } if (arc[y][x]==2) return; arc[y][x]=2; DFS(y+go[face][1],x+go[face][0],face,step+1); arc[y][x]=0; } int main() { freopen("snail.in","r",stdin); freopen("snail.out","w",stdout); int m,i,j; char c; cin>>n>>m; memset(arc,0,sizeof(arc)); for (i=0;i<=n+1;i++) arc[0][i]=arc[n+1][i]=arc[i][0]=arc[i][n+1]=1; while (m--) { cin>>c>>i; arc[i][c-'A'+1]=1; } ans=0; DFS(1,1,1,1); DFS(1,1,2,1); cout<<ans<<endl; return 0; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值