洛谷 P 1560

题目链接:蜗牛的旅行


思路:dfs 从 (1,1)开始搜索分别向右和向下搜索,遇到障碍物就改变方向,遇到自己走过的路线就更新最大值

#include<iostream>
#include<cstdio>
using namespace std;
int a[300][300];
bool vis[300][300],vis1[300][300]; // vis 标记蜗牛走的路线,vis1 标记障碍物 
int xx[4] = {0,0,1,-1}; // 与下面两个判断函数中的数值对应
int yy[4] = {1,-1,0,0};
int y,ans=0,n,m;
int pd1(int x)
{
	if(x == 0) return 2;//0 表示向右
	if(x == 1) return 3;//1 表示向左 
	if(x == 2) return 0;//2 表示向下 
	if(x == 3) return 1;//3 表示向上 
}
int pd(int x)
{
    if(x==0) return 3;
    if(x==1) return 2;
    if(x==2) return 1;
    if(x==3) return 0;
}
void dfs(int x,int y,int s,int d)
{
	if(vis[x][y]) return ;
	ans = max(ans,s);
	int nex = x+ xx[d];
	int ney = y + yy[d];
	vis[x][y] = 1;
	if(nex>=1&&ney<=n&&nex<=n&&ney>=1&&!vis1[nex][ney]) // 如果不是障碍物 
		dfs(nex,ney,s+1,d);
	else {
		int nd = pd1(d); // 找旋转 90° 后的第一个方向 
		nex = x + xx[nd];
		ney = y + yy[nd];
		if(nex>=1&&ney<=n&&nex<=n&&ney>=1&&!vis1[nex][ney])
			dfs(nex,ney,s+1,nd);
		nd = pd(d);// 找旋转90°后的第二个方向 
		nex = x + xx[nd];
		ney = y + yy[nd];
		if(nex>=1&&ney<=n&&nex<=n&&ney>=1&&!vis1[nex][ney])
			dfs(nex,ney,s+1,nd);
	}
	vis[x][y] = 0;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		char ch;
		cin>>ch;
		int x = ch-'A'+1;
		scanf("%d",&y);
		vis1[x][y] = 1;
	}
	dfs(1,1,1,0);// 0 表示 向右 
	dfs(1,1,1,2);// 2 表示 向下 
	printf("%d",ans);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值