ACM篇:POJ 1139 -- Cat and Mouse

来源:互联网 发布:儿童摄影网络推广 编辑:程序博客网 时间:2024/04/28 13:38

首先标记猫可能出现的房间,然后便是简单的深搜。

Also, the mouse can make a walk through two rooms…
本来以为这句话要求米奇经过至少两个不为
起点的房间,但似乎只需一个就够了,也就是说根本不用判断经过房间数。

#include <iostream>#include <cstdio>#include <queue>#include <cstring>#include <vector>#include <cstdlib>#define min(a,b) (((a) < (b)) ? (a) : (b))#define max(a,b) (((a) > (b)) ? (a) : (b))using namespace std;const int MAX = 100;int n;int cat;int mouse;bool danger[MAX+2];vector<int > road[MAX+2];void read_road(){    for (int i = 1; i <= MAX; i++)        road[i].clear();    int a, b;    while (scanf("%d%d", &a, &b) && a != -1 && b != -1)        road[a].push_back(b);}void cat_dfs(int x){    danger[x] = true;    int sz = road[x].size();    for (int i = 0; i < sz; i++)    {        if (!danger[road[x][i]])            cat_dfs(road[x][i]);    }}void cat_walk(){    read_road();    memset(danger, 0, sizeof(danger));    cat_dfs(cat);}bool visit[MAX+2];bool meet;bool can;void mouse_dfs(int x){    if (danger[x])    {        meet = true;        return;    }    visit[x] = true;    int sz = road[x].size();    for (int i = 0; i < sz; i++)    {        if (road[x][i] == mouse)            can = true;        if(!visit[road[x][i]])            mouse_dfs(road[x][i]);    }}void mouse_walk(){    read_road();    meet = can = false;    memset(visit, 0, sizeof(visit));    mouse_dfs(mouse);}int main(){    int T;    int kase = 0;    scanf("%d", &T);    while (++kase <= T)    {        scanf("%d%d%d", &n, &cat, &mouse);        cat_walk();        mouse_walk();        printf("%c %c\n", (meet) ? 'Y' : 'N', (can) ? 'Y' : 'N');    }    return 0;}
0 0
原创粉丝点击