0507:Square

整数nの分割を辞書順に出力する問題。

nを現在並べられるブロックの個数、
mを直前に並べたブロックの個数として
再帰関数を書いた。

#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
void func(int n, int m, vector<int>res){
 
  if(n==0){
    for(int i=0;i<res.size();i++){
      cout << res[i];
      if(i==res.size()-1)cout << endl;
      else cout << " ";
    }
    return;
  }
    
  for(int i=0;i<m;i++){
    if(m-i>n)continue;
    res.push_back(m-i);
    func(n-m+i,m-i,res);
    res.pop_back();
  }
}
 
int main(void){
 
  int n;
  vector<int>res;
 
  while(cin >> n,n)
    func(n,n,res);
 
  return 0;
}