[USACO5.2] Snail Trails

搜索就能水过。

洛谷 P1560 传送门

搜索传参的时候,除了要传坐标和已走的步数,还要传方向。

走过了就标记,回溯的时候清标记(都是常规操作了)。

边界也要被视为障碍,刚开始把这个忘了,结果听取WA声一片......

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n,b,ans;
 7 int m[125][125];
 8 int dx[]={0,0,1,0,-1};
 9 int dy[]={0,1,0,-1,0};
10 
11 void dfs(int x,int y,int dir,int step)
12 {
13     if(step>ans)ans=step;
14     if(!m[x+dx[dir]][y+dy[dir]])
15     {
16         m[x][y]=-1;
17         dfs(x+dx[dir],y+dy[dir],dir,step+1);
18         m[x][y]=0;
19     }else if(m[x+dx[dir]][y+dy[dir]]==1)
20     {
21         for(int i=1;i<=4;i++)
22         {
23             if((!m[x+dx[i]][y+dy[i]])&&((i+dir)%2))
24             {
25                 m[x][y]=-1;
26                 dfs(x+dx[i],y+dy[i],i,step+1);
27                 m[x][y]=0;
28             }
29         }
30     }
31 }
32 
33 int main()
34 {
35     scanf("%d%d",&n,&b);
36     for(int i=1;i<=b;i++)
37     {
38         char s[10];
39         scanf("%s",s+1);
40         int px=s[1]-'A'+1;
41         int py=0,pp=2;
42         while(s[pp]>='0'&&s[pp]<='9')
43             py=py*10+s[pp++]-'0';
44         m[px][py]=1;
45     }
46     for(int i=1;i<=n;i++)
47         m[0][i]=m[i][0]=m[n+1][i]=m[i][n+1]=1;
48     dfs(1,1,1,1);
49     dfs(1,1,2,1);
50     printf("%d",ans);
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/eternhope/p/9760256.html