“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛

D题
车辆调度

  • 数据量很小10x10,直接dfs
  • 搜索树深度<=5,每一层枚举每辆车向4个方向走的方案
  • 当递归深度==K时判断是否有车停在目标点
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif
 
 
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#define MAXN ((int)1e5+7)
#define ll long long int
#define QAQ (0)
#include <sstream>
 
using namespace std;
 
int n, m, K;
int dr[] = { 1, -1, 0, 0 }; //4个方向
int dc[] = { 0, 0, 1, -1 };
char mtx[16][16], tmp[16][16]/*用来模拟车的位置(0没有车,1有车)*/;
struct Node {
    int r, c;
} ;
 
bool check(int x, int y) { //判断是否越界
    return mtx[x][y];
}
 
bool ok = false;
void dfs(int level, vector<Node> v) {
    if(ok) return ;
    if(level == K) { //第level步恰好有在目标格子的车就ok=true
        for(int i=1; i<=n; i++)
            for(int k=1; k<=m; k++)
                if(tmp[i][k] && mtx[i][k]=='D') {
                    ok = true;
                    goto p;
                }
        p:
        return ;
    }
    for(int i=0; i<int(v.size()) && !ok; i++) { //枚举每辆车
        Node& no = v[i];
        //每辆车都有4个方向
        for(int k=0; k<4 && !ok; k++) {
            int tmpr = no.r, tmpc = no.c;
 
            //移动到这个方向,直到撞墙或撞车
            while(check(no.r+dr[k], no.c+dc[k]) &&
                    (mtx[no.r+dr[k]][no.c+dc[k]]!='X')
                    && !(tmp[no.r+dr[k]][no.c+dc[k]])) {
                no.r += dr[k], no.c += dc[k];
            }
            tmp[no.r][no.c] = true;
            tmp[tmpr][tmpc] = false;
            dfs(level+1, v); //递归下一步
            tmp[no.r][no.c] = false; //还原现场
            tmp[tmpr][tmpc] = true;
            no.r = tmpr, no.c = tmpc;
        }
    }
}
 
int main() {
#ifdef debug
    freopen("test", "r", stdin);
    clock_t stime = clock();
#endif
    scanf("%d %d %d ", &m, &n, &K);
    vector<Node> vec;
    for(int i=1; i<=n; i++) {
        scanf("%s ", mtx[i]+1);
        for(int k=1; k<=m; k++)
            if(mtx[i][k] == 'R') vec.push_back({i, k});
    }
    dfs(0, vec);
    printf("%s\n", ok ? "YES" : "NO");
 
 
 
#ifdef debug
    clock_t etime = clock();
    printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif
    return 0;
}