YES
题意:这个题目的意思是给定你起点S,和终点D,问你是否能在 T 时刻恰好到达终点D。
分析:这样一看很明显是DFS,不过里面涉及到很多剪枝。
奇偶剪枝:
现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点
s
|
||||
|
|
||||
|
|
||||
|
|
||||
+
|
—
|
—
|
—
|
e
|
s
|
—
|
—
|
—
|
|
—
|
—
|
+
|
||
|
|
+
|
|||
|
|
||||
+
|
—
|
—
|
—
|
e
|
#include<iostream> #include<cmath> using namespace std; int f[4][2]= {{0,-1},{0,1},{-1,0},{1,0}}; char map[8][8]; int n,m,t,flag,di,dj; void dfs(int si,int sj,int cur) {int x,y; if(si>n||sj>m||si<=0||sj<=0)//出界 return; if(cur==t&&si==di&&sj==dj)//到达终点 { flag=1; } if(flag) return; int s=abs(di-si)+abs(dj-sj); int time=t-cur-s; if(time<0||time&1)//看剩下的时间能能否到达终点,time&1则是判断其是否偶数 return; for(int i=0;i<4;i++) { x=si+f[i][0]; y=sj+f[i][1]; if(map[x][y]!='X') { map[x][y]='X'; dfs(x,y,cur+1); map[x][y]='.'; } } } int main() {int i,j,si,sj; while(cin>>n>>m>>t&&n&&m&&t) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>map[i][j]; if(map[i][j]=='S') { si=i; sj=j; } else if(map[i][j]=='D') { di=i; dj=j; } } flag=0; map[si][sj]='X'; dfs(si,sj,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }