D.车辆调度(DFS)
思路:对每个小车进行 ,判断能否在 步内到达点 .这里的一步是指不碰到障碍物或走出地图边界。
具体看代码。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=15;
char mp[N][N];
int ok,w,h,k,d[4][2]={0,1,0,-1,1,0,-1,0};
bool ck(int x,int y){ //检查该点是否能走.
if(x>=1&&x<=h&&y>=1&&y<=w&&mp[x][y]!='R'&&mp[x][y]!='X') return 1;
return 0;
}
void dfs(int cnt){ //对每个小车进行dfs
if(cnt>=k) return;
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
if(mp[i][j]=='R')
for(int l=0;l<4;l++){
int nx=i,ny=j;
while(ck(nx+d[l][0],ny+d[l][1]))
nx+=d[l][0],ny+=d[l][1];
if(mp[nx][ny]=='D'){
ok=1;
}
if(ok) break;//这里若已经找到满足的小车就不用再dfs了
swap(mp[nx][ny],mp[i][j]);
dfs(cnt+1);
swap(mp[nx][ny],mp[i][j]);//回溯.
}
}
int main(){
scanf("%d%d%d",&w,&h,&k);
for(int i=1;i<=h;i++) scanf("%s",mp[i]+1);
dfs(0);
puts(ok?"YES":"NO");
return 0;
}