题目地址:3rd_Practice_A:Illusive Chase
题目大意:先给你一幅图,0表示可以走,1表示障碍物。在第1s的时候,向R(右)走12步,第2s的时候,向D(下)方向走12步,第3s的时候向右走一步。问有多少个起始点满足要求。

tag:对每个点来遍DFS

note:二维数组中的xy容易搞混,,,
up和down的加减容易搞混
前几次提交中忽略了i=1~a的过程中碰到障碍的情况

通过此题更加理解DFS、回溯法、边界
此题的核心语句:if(dfs(cx,cy,step+1)) return 1
AC代码:

#include <iostream>
#include <cstdio>
using namespace std;
int m, n, p;
int mp[105][105];
int dir[4][2]={
   {
   -1,0},{
   0,1},{
   1,0},{
   0,-1}};
int cnt;
struct node
{
   
    int a;
    int b;
    int val;
}nod[10005];

int dfs(int x,int y,int step) {
   
    if (x<0||x>=m||y<0||y>=n||mp[x][y]==1)
        return 0;
    if(step == p + 1) return 1;
    int a = nod[step].a;
    int b = nod[step].b;
    int dd = nod[step].val;
    int cx,cy;
    for(int i = 1; i < a; i++) {
   
        cx=x+dir[dd][0]*i;cy=y+dir[dd][1]*i;
        if(mp[cx][cy]) return 0;
    }
    for(int i = a; i <= b; i++)
    {
   
        cx=x+dir[dd][0]*i;cy=y+dir[dd][1]*i;
        if(cx<0||cx>=m||cy<0||cy>=n) break;
        if(mp[cx][cy]) break;
        if(dfs(cx,cy,step+1)) return 1;//*核心*
    }
    return 0;
}

int main() {
   
    int t;
    scanf("%d", &t);
    while(t--) {
   
        cnt = 0;
        p = 0;
        scanf("%d %d",&m, &n);
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
                scanf("%d", &mp[i][j]);
        int a, b;
        char c;
        while(scanf("%d%d",&a,&b)==2&&(a+b)) {
   
            getchar();
            c = getchar();
            nod[++p].a = a;
            nod[p].b = b;
            if(c=='U') nod[p].val=0;
            else if(c=='D') nod[p].val=2;
            else if(c=='L') nod[p].val=3;
            else if(c=='R') nod[p].val=1;
        }
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++) {
   
                if(!mp[i][j]&&dfs(i,j,1)) {
   
                    cnt++;
                }
            }
        printf("%d\n", cnt);

    }
    return 0;
}