ACM篇:POJ 1139 -- Cat and Mouse

首先標記貓可能出現的房間,然後便是簡單的深搜。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章