D.车辆调度(DFS)

D.车辆调度(DFS)

题目传送门

思路:对每个小车进行 d f s dfs ,判断能否在 k k 步内到达点 D D .这里的一步是指不碰到障碍物或走出地图边界。

具体看代码。

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;
} 
原创文章 201 获赞 165 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106050923