【搜索】dfs走格子求最长路径 ——P1560 蜗牛的旅行

看似bfs的dfs题
bfs存不了状态

例题:
P1560 [USACO5.2]蜗牛的旅行Snail Trails

Sally Snail 喜欢在N x N 的棋盘上闲逛(1 < n <= 120)。
她总是从棋盘的左上角出发。棋盘上有空的格子(用“.”来表示)和B 个路障(用“#”来表示)。

萨丽总是垂直(向上或者向下)或水平(向左或者向右)地走。她可以从出发地(总是记作A1 )向下或者向右走。一旦萨丽选定了一个方向,她就会一直走下去。 如果她遇到棋盘边缘或者路障,她就停下来,并且转过90 度。她不可能离开棋盘,或者走进路障当中。并且,萨丽从不跨过她已经经过的格子。当她再也不能走的时候,她就停止散步。

计算并输出,如果萨丽聪明地选择她的路线的话,她所能够经过的最多格子数。
在这里插入图片描述
代码

#include<iostream>
#include<cstdio>
#include<queue>
#define maxn 15000
using namespace std;

int n,b,ans;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int a[210][210];
struct node{
	int x,y;
}s[maxn];

void dfs(int x,int y,int sum){
	int p=sum;
	for(int i=0;i<4;i++){
		int nx=x+dx[i];
		int ny=y+dy[i];
		while(!a[nx][ny]){
			s[++p]=(node){nx,ny};
			a[nx][ny]=2;
			nx+=dx[i]; ny+=dy[i];
		}nx-=dx[i], ny-=dy[i];
		if(nx==x&&ny==y) continue;
		ans=max(ans,p);
		if(a[nx+dx[i]][ny+dy[i]]!=2) dfs(nx,ny,p);
		while(p>sum){
			a[s[p].x][s[p].y]=0;
			p--;
		}
	}
}

int main(){
	scanf("%d%d",&n,&b);
	for(int i=1;i<=b;i++){
		char ch; int x,y;
		cin>>ch>>x;
		y=ch-'A'+1;
		a[x][y]=1;
	}
	for(int i=1;i<=n;i++){
		a[0][i]=a[n+1][i]=a[i][0]=a[i][n+1]=1;
	}
	a[1][1]=2; s[1]=(node){1,1};
	dfs(1,1,1);
	printf("%d",ans);
	return 0;
} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值