題目敘述
每筆測資有兩個正整數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);
}
}
留言
張貼留言