看似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;
}