解析:
将所有的车作为状态,然后dfs枚举第i分钟每辆车移动的方向
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int>PII;
PII q[1000];
int w,h,k;
char s[20][20];
int cnt;
int ans;
bool vis[20][20];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
bool check(int x,int y)
{
if(x<1||x>h||y<1||y>w||s[x][y]=='X'||s[x][y]=='R') return false;
return true;
}
void dfs(int time)
{
if(ans) return ;
if(time==k+1) return ;
for(int i=1;i<=cnt;i++)
{
for(int j=0;j<4;j++)
{
int px=q[i].x,py=q[i].y;
int tx=q[i].x,ty=q[i].y;
while(check(px+dx[j],py+dy[j])) px+=dx[j],py+=dy[j];
q[i]={px,py};
// cout<<px<<" "<<py<<endl;
if(vis[px][py]) {ans=1;break;}
s[px][py]='R';
s[tx][ty]='*';
dfs(time+1);
s[px][py]='*';
s[tx][ty]='R';
q[i]={tx,ty};
}
if(ans)return ;
}
}
int main()
{
cin>>w>>h>>k;
for(int i=1;i<=h;i++) cin>>(s[i]+1);
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
{
if(s[i][j]=='R') q[++cnt]={i,j};
if(s[i][j]=='D') vis[i][j]=1;
}
dfs(1);
// cout<<ans<<endl;
if(ans) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}