#include <iostream>
#include <cstring>

using namespace std;

void print(int v[], int size){
    for(int i = 0; i < size; i++) cout << v[i] << " ";
}

int next_partition(int v[], int size){
	if(v[0] == 0){
		int i;
		for(i = 0; v[i] == 0; i++);
		if(i >= size - 1) return 0;
		
		v[i + 1]++;
		v[0] = v[i] - 1;
		v[i] = 0;
	}else{
		v[0]--;
		v[1]++;
	}
	return 1;
}

int next_sign(int v[], int size){
	int i;
	for(i = 0; i < size; i++){
		v[i] = -v[i];
		if(v[i] < 0) break;
	}
	return (i != size);
}

int f(int v[], int size){
	int retval = 0;
	for(int i = 0; i < size; i++) retval += v[i];
	return retval;
}

void search(int size, int max_distance){
	int v[size];
	int i;
	
	for(i = 0; i <= max_distance; i++){
		memset(v, 0, sizeof(int) * size);
		v[0] = i;
		do{
			do{
				
				cout << "v = ( ";
				print(v, size);
				cout << "), f(v) = " << f(v, size) << endl;
				
			}while(next_sign(v, size));
		}while(next_partition(v, size));
	}	
}

int main(){
	search(3, 4);
	return 0;
}