ZeroJudge D105: 傳球遊戲

題目敘述

每筆測資有兩個正整數N和M,代表有N個人圍成一個圓圈,以及要傳球M次。每次傳球只能傳給左右兩邊的人。要求輸出有幾種傳球方法可以傳M次之後傳回第一個人手上。


範例輸入 #1

3 3 


範例輸出 #1

2


解題思路

使用BFS來處理,每一次計算球要傳給誰,並且將每個起點的次數進行加總,可以利用Map來做存取,並且每次跑BFS的時候都回傳這個Map,當BFS的次數等於M時就將第一個人的Map值輸出。

解題程式碼如下 (僅供參考):

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int N, M;

void BFS(vector<int>start, int count, map<int, int>MAP)
{
    vector<int>newStart;
    map<int, int>exist;
    for (int i = 0; i<start.size(); i++)
    {
        int left = start[i] - 1, right = start[i] + 1;
        if (left < 1) left = N;
        if (right > N) right = 1;
        if (exist[left] == 0) newStart.push_back(left);
        if (exist[right] == 0) newStart.push_back(right);
        exist[left] += MAP[start[i]];
        exist[right] += MAP[start[i]];
    }
    if (count == M-1)
    {
        cout << exist[1] << "\n";
        return;
    }
    BFS(newStart, count+1, exist);
}

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    cout.sync_with_stdio(0);
    cout.tie(0);
    cin >> N >> M;
    if (M == 1) cout << "0\n";
    else
    {
        vector<int>start;
        start.push_back(1);
        map<int, int>MAP;
        MAP[1] = 1;
        BFS(start, 0, MAP);
    }
}

留言