[VijosP1656]萌萌赶考 题解
题目大意:
有一个地图,有障碍,不能重复经过一点(但起点可以),判断能否恰好在t时刻从起点到达终点。
思路:
一开始DFS一遍,30分,于是要有优化减枝。最重要的是从起点到终点的距离的奇偶性是与起点与终点的曼哈顿距离的奇偶性一样(因为远离“最短路”后必将回来,所以会加一个偶数,奇偶性不变)当然还有其他,如最短距离+当前时间>要求时间则减去、搜索方向为先左上再右下。
代码:
1 #include<cstdio> 2 const int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1}; 3 int n,m,t,i,j,b,e,a[9][9]; 4 char s[9]; 5 6 int abs(int x) { return x>0?x:-x; } 7 8 bool dfs(int x,int y,int k) 9 { 10 if (k==t) 11 { 12 if (x==b && y==e) return 1; 13 return 0; 14 } 15 if (abs(x-b)+abs(y-e)+k>t) return 0; 16 for (int i=0,p,q;i<4;++i) 17 if (a[p=x+dx[i]][q=y+dy[i]]) 18 { 19 a[p][q]=0; 20 if (dfs(p,q,k+1)) return 1; 21 a[p][q]=1; 22 } 23 return 0; 24 } 25 26 int main() 27 { 28 for (scanf("%d%d%d",&n,&m,&t);n && m && t;scanf("%d%d%d",&n,&m,&t)) 29 { 30 for (i=1;i<n+2;++i) 31 for (j=1;j<m+2;++j) a[i][j]=0; 32 for (i=1;i<=n;++i) 33 { 34 scanf("%s",s+1); 35 for (j=1;j<=m;++j) 36 if (s[j]!='H') 37 { 38 if (s[j]=='D') b=i,e=j; 39 a[i][j]=1; 40 } 41 } 42 if ((((b+e)&1)==(t&1)) && dfs(1,1,0)) printf("Yes\n"); 43 else printf("No\n"); 44 } 45 return 0; 46 }
我一直在繁华的苍凉中徘徊着,用一颗OI的心寻找着生命和宇宙的美妙与玄奥。