题目链接:蜗牛的旅行
思路: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;
}