题意理解半天。。大意就是先给一个矩阵代表空间,1是障碍,0可以走,然后的行代表这一步的区间,比如说1 3 R代表可以向右走1步2步或3步,前提是中间没障碍且不越界,给出每步的可能组合后,问有多少初始位置可以按这样走的合法路线,遍历每个格子,每个格子DFS一下看看有没有合法路线,反正看懂了就好做了。。
#include<cstdio>
#include<vector>
using namespace std;
namespace
{
bool a[100][100], find;
int m, n;
vector<pair<pair<int, int>, char> > V;
bool check_range(int r, int c, char ch, int step)
{
if (ch == 'U')
return r - step >= 0;
else if (ch == 'D')
return r + step < m;
else if (ch == 'L')
return c - step >= 0;
else
return c + step < n;
}
void dfs(int r, int c, size_t depth)
{
if (find)
return;
if (depth == V.size())
{
find = true;
return;
}
int min = V[depth].first.first;
int max = V[depth].first.second;
char ch = V[depth].second;
for (int i = min; i <= max; i++)
if (check_range(r, c, ch, i))
{
if (ch == 'U')
{
for (int j = r - 1; j >= r - i; j--)
if (a[j][c])
return;
dfs(r - i, c, depth + 1);
}
else if (ch == 'D')
{
for (int j = r + 1; j <= r + i; j++)
if (a[j][c])
return;
dfs(r + i, c, depth + 1);
}
else if (ch == 'L')
{
for (int j = c - 1; j >= c - i; j--)
if (a[r][j])
return;
dfs(r, c - i, depth + 1);
}
else
{
for (int j = c + 1; j <= c + i; j++)
if (a[r][j])
return;
dfs(r, c + i, depth + 1);
}
}
}
}
int main()
{
int t, temp;
scanf("%d", &t);
while (t--)
{
V.clear();
scanf("%d %d", &m, &n);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
scanf("%d", &temp);
a[i][j] = temp;
}
int min, max;
while (scanf("%d %d", &min, &max), min || max)
{
getchar();
char c = getchar();
V.push_back(make_pair(make_pair(min, max), c));
}
int res = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (!a[i][j])
{
find = false;
dfs(i, j, 0);
if (find)
res++;
}
printf("%d\n", res);
}
return 0;
}