题意:给出一个数组,分别从1和N开始数k,m,然后将选中的数删除,继续直到数组长度为0
思路:主要是用stl中的list
代码如下:
#include <iostream>
#include <fstream>
#include <list>
#include <iomanip>
using namespace std;
void solve(int n, int k, int m);
int main()
{
#ifndef ONLINE_JUDGE
ifstream fin("F:\\OJ\\uva_in.txt");
streambuf *old = cin.rdbuf(fin.rdbuf());
#endif
int n, k, m;
while (cin >> n >> k >> m)
{
if (n == 0 && k == 0 && m == 0) break;
solve(n, k, m);
}
#ifndef ONLINE_JUDGE
cin.rdbuf(old);
#endif
return 0;
}
void solve(int n, int k, int m)
{
list<int> l;
for (int i = 1; i <= n; i++)
{
l.push_back(i);
}
list<int>::iterator kit = l.begin(), mit = --l.end();
while (l.size() != 0)
{
for (int i = 1; i < k; i++)
{
kit++;
if (kit == l.end()) kit = l.begin();
}
for (int i = 1; i < m; i++)
{
mit--;
if (mit == l.end()) mit = --l.end();
}
if (*kit == *mit)
{
cout << setw(3) << right << *kit;
kit = l.erase(kit);
if (kit == l.end()) kit = l.begin();
mit = kit;
mit--;
if (mit == l.end()) mit = --l.end();
if (l.size() != 0) cout << ",";
}
else
{
cout << setw(3) << right << *kit << setw(3) << right << *mit;
list<int>::iterator it = kit;
it++; if (it == l.end()) it = l.begin();
if (it == mit)
{
mit = l.erase(mit);
if (mit == l.end()) mit = --l.end();
kit = l.erase(kit);
if (kit == l.end()) kit = l.begin();
mit--;
if (mit == l.end()) mit = --l.end();
}
else
{
kit = l.erase(kit);
if (kit == l.end()) kit = l.begin();
mit = l.erase(mit);
if (mit == l.end()) mit = --l.end();
else
{
mit--;
if (mit == l.end()) mit = --l.end();
}
}
if (l.size() != 0) cout << ",";
}
}
cout << endl;
}