您的位置:首页 > 其它

hdu 1112

2016-07-24 08:57 309 查看
模拟 注意钥匙的左右边缘不能超过锁的范围 就算是空白也不行

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#define pi acos(-1.0)
#define inf 1<<29
#define INF 0x3f3f3f3f
#define zero 1e-8

using namespace std;

char lock[10507][1207];
char key[127][127];
bool flag[1107][1207];

struct edge {
int x, y;
} lef[10007], rig[10007], down[10007];

int l, rr, d;
int r, c, n, m;
int depth;
int len;
void todo()
{
l = 0;
r = 0;
d = 0;
len = 0;

for (int i = 0; i < rr; ++i)
for (int j = 0; j < c; ++j) {
if (key[i][j] == '#') {
if (j > 0 && key[i][j - 1] == '#') continue;
lef[l].x = i;
lef[l++].y = j;

}
}
for (int i = 0; i < rr; ++i)
for (int j = c - 1; j >= 0; --j) {
if (key[i][j] == '#') {
if (j < c - 1 && key[i][j + 1] == '#') continue;
rig[r].x = i;
rig[r++].y = j;
}
}

for (int j = 0; j < c; ++j)
for (int i = rr - 1; i > -1; --i) {
if (key[i][j] == '#') {
if (i < rr - 1 && key[i + 1][j] == '#') continue;
down[d].x = i;
down[d++].y = j;
}
}

}

bool j_left(int x, int y)
{
for (int i = 0; i < l; ++i)
if (y < 0 || lock[lef[i].x + x][lef[i].y + y] == '#') {
return false;
}

return true;
}

bool j_right(int x, int y)
{

for (int i = 0; i < r; ++i) {
if (c + y > m || lock[rig[i].x + x][rig[i].y + y] == '#') {
return false;
}

}

return true;
}

bool j_down(int x, int y)
{

for (int i = 0; i < d; ++i) {

if (x > n + rr || lock[down[i].x + x][down[i].y + y] == '#') {
return false;
}
}
return true;
}

void rem(int x, int y)
{

flag[down[0].x + x][down[0].y + y] = true;
}

bool ifdo(int x, int y)
{

if (!flag[down[0].x + x][down[0].y + y]) return true;
return false;

}
void dfs(int x, int y)
{

if (x > depth) depth = x;
if (depth == n + rr) return ;
rem(x, y);

if (j_down(x + 1, y) && ifdo(x + 1, y)) dfs(x + 1, y);
if (j_left(x, y - 1) && ifdo(x, y - 1)) dfs(x, y - 1);
if (j_right(x, y + 1) && ifdo(x, y + 1)) dfs(x, y + 1);

}

int main()
{

int t;
cin >> t;
for (; t--;) {

scanf("%d %d", &rr, &c);

for (int i = 0; i < rr; ++i) {
scanf("%s", key[i]);
}

scanf("%d %d", &n, &m);

memset(lock, '.', sizeof(lock));

for (int i = rr; i < rr + n; ++i) {
scanf("%s", lock[i]);
}

todo();
depth = 0;
if (c > m) {
printf("The key falls to depth 0.\n");
continue;
}
if (r == 0 && l == 0 && d == 0) {
printf("The key can fall through.\n");
continue;
}

memset(flag, false, sizeof(flag));

dfs(0, 0);
if (depth >= n + rr) printf("The key can fall through.\n");
else
printf("The key falls to depth %d.\n", depth);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: