Section 5.2 Snail Trails

/*
ID: niepeng1
PROG: snail
LANG: C++
*/
/*
 这个问题简单,只需要简单的深搜索就行了。
 基本的深搜,可是我却花了好久。
 问题就在,在一个点搜索的额时候没有记忆已
 经搜索的方向,导致函数在一个点上左右上
 下方向变换个不停,导致函数陷入死循环,囧。
 后来又优化一下。挺简单的其实。
*/
#include<math.h>
#include<iostream>
#include<memory.h>
using namespace std;
int map[121][121];

int n,m,max1=0;
void Dfs(int x,int y,int dir,int num)
{
 if(max1 <num)
  max1=num;
 switch(dir)
 {
 case 0:
  if(x == n-1 || map[x+1][y]==1)
  {
   if(y<n-1&&map[x][y+1]==0)
   {
    Dfs(x,y,1,num);
   }
   if(y>0&&map[x][y-1]==0)
   {
    Dfs(x,y,3,num);
   }
  }
  else
  {
   if(map[x+1][y]==-1)
    return;
/*   {
    if( max1 < num)
     max1=num;
    return;
   }
*/
    
   else
   {
    map[x][y]=-1;
    Dfs(x+1,y,0,num+1);
    map[x][y]=0;
   }
  }
  break;
 case 1:
  if(y == n-1 || map[x][y+1]==1)
  {
   if(x<n-1&&map[x+1][y]==0)
   {
    Dfs(x,y,0,num);
   }
   if(x>0&&map[x-1][y]==0)
   {
    Dfs(x,y,2,num);
   }
  }
  else
  {
   if( map[x][y+1]==-1)
    return;
/*   {
    if( max1 < num)
     max1=num;
    return;
   }
*/
   else
   {
    map[x][y]=-1;
    Dfs(x,y+1,1,num+1);
    map[x][y]=0;
   }
  }
  break;
 case 2:
  if(x == 0 || map[x-1][y]==1)
  {
   if(y<n-1&&map[x][y+1]==0)
   {
    Dfs(x,y,1,num);
   }
   if(y>0&&map[x][y-1]==0)
   {
    Dfs(x,y,3,num);
   }
  }
  else
  {
   if(map[x-1][y]==-1)
    return;
/*   {
    if( max1 < num)
     max1=num;
    return;
   }
*/
   else
   {
    map[x][y]=-1;
    Dfs(x-1,y,2,num+1);
    map[x][y]=0;
   }
  }
  break;
 case 3:
  if(y == 0 || map[x][y-1]==1)
  {
   if(x<n-1&&map[x+1][y]==0)
   {
    Dfs(x,y,0,num);
   }
   if(x>0&&map[x-1][y]==0)
   {
    Dfs(x,y,2,num);
   }
  }
  else 
  {
   if(map[x][y-1]==-1)
    return;
/*   {
    if( max1 < num)
     max1=num;
    return;
   }
*/
   else
   {
    map[x][y]=-1;
    Dfs(x,y-1,3,num+1);
    map[x][y]=0;
   }
  }
  break;
 }
}
int main()
{
 freopen("snail.in","r",stdin);
 freopen("snail.out","w",stdout);
 int i,y;
 char x;
 scanf("%d %d",&n,&m);
 memset(map,0,sizeof(map));
 getchar();
 for(i=0;i<m;i++)
 {
  scanf("%c %d",&x,&y);
  getchar();
  map[x-'A'][y-1]=1;
 }
 map[0][0]=-1;

 Dfs(0,0,0,0);
 Dfs(0,0,1,0);

 printf("%d/n",max1+1);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值