搜索就能水过。
搜索传参的时候,除了要传坐标和已走的步数,还要传方向。
走过了就标记,回溯的时候清标记(都是常规操作了)。
边界也要被视为障碍,刚开始把这个忘了,结果听取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 }