- 作者:zhaozj
- 发表时间:2020-12-23 10:54
- 来源:未知
// Copyright (C) 2004 BenBear//// This file is an algorithm of combination. This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.
// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING. If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
#include <iostream>#include <cstdlib>using namespace std;
template <typename BiIter>inline void__combi_reverse (BiIter first, BiIter last){ reverse (first, last);}
template <typename BiIter>boolnext_combination_count (BiIter first, BiIter last){ if (first == last) return false; BiIter i = last; if (--i == first) return false; if (*i-- == 0) { while ((i != first) && (*i == 0)) --i; if (*i == 0) return false; BiIter j = i; iter_swap (i, ++j); return true; } while ((i != first) && (*i == 1)) --i; if (i == first) { if (*i == 0) iter_swap (first, --last); return false; } BiIter ii = i; while ((--ii != first) && (*ii == 0)) ; if (*ii == 0) { __combi_reverse (first, last); return false; } BiIter jj = ii; iter_swap (ii, ++jj); __combi_reverse (++jj, last); return true;}
template <typename BiIter>boolprev_combination_count (BiIter first, BiIter last){ if (first == last) return false; BiIter i = last; if (--i == first) return false; while ((i != first) && (*i == 0)) --i; if (i == first) { if (*i == 1) iter_swap (first, --last); return false; } BiIter j = i; --j; if (*j == 0) { iter_swap (i, j); return true; } while ((--j != first) && (*j == 1)) ; if (*j == 1) { __combi_reverse (first, last); return false; } BiIter jj = j; iter_swap (j, ++jj); __combi_reverse (++jj, last); return true;}