Exemple #1
0
/* Pre: perm is initialized, hist[0..rank-1] is descending.
 * Create the list of permutations (as powers of 2)
 * that preserve hist[0..rank-1]  */
Arraylist specPerm(int rank, int* hist) {
	int i, j, k, m, x;
	Intstack prim = newIntstack(rank, NULL) ;
	Arraylist result = newArraylist(1) ;
	Arraylist locperm;
	prim->size = rank;
	for (i = 0, x = 1; i < rank; i++, x <<= 1) {
		prim->it[i] = x;
	}
	putItem(prim, result) ;
	i = 0;
	while (i + 1 < rank) {
		j = i+1;
		while (j < rank && hist[i] == hist[j])
			j++;
		if (i+1 < j) {
			x = result->size;
			locperm = getPerm(j-i) ;
			for (k = 0; k < locperm->size - 1; k++)
				for (m = 0; m < x; m++)
					putItem(applyPerm(i, result->it[m], locperm->it[k]), result) ;
		}
		i = j;
	}
	return result;
}
Exemple #2
0
Arraylist getPerm(int rank) {
	int i, j, k;
	Intstack y, z;
	if (!permInit)
		initPerm() ;
	if (perm[rank] != NULL)
		return perm[rank];
	if (perm[rank-1] == NULL)
		getPerm(rank-1) ;
	perm[rank] = newArraylist(rank * perm[rank-1]->size) ;
	for (i = 0; i < perm[rank-1]->size; i++) {
		y = perm[rank-1]->it[i];
		for (j = 0; j < rank; j++) {
			z = newIntstack(rank, NULL);
			for (k = 0; k < j; k++)
				z->it[k] = y->it[k];
			z->it[j] = rank - 1;
			for (k = j; k < y->size; k++)
				z->it[k+1] = y->it[k];
			z->size = rank;
			putItem(z, perm[rank]) ;
		}
	}
	return perm[rank];
}
 vector<vector<int> > permuteUnique(vector<int> &num) {
     // Start typing your C/C++ solution below
     // DO NOT write int main() function
     vector<vector<int>> ret;
     int cnt = num.size();
     if(!cnt)    return ret;
     bool avl[cnt];
     memset(avl,1,sizeof(bool)*cnt);
     sort(num.begin(),num.end());
     vector<int> temp;
     getPerm(ret,num,temp,avl);
     return ret;
 }
 void getPerm(vector<vector <int>> &ret, vector<int> &num, vector<int> &temp,bool * avl){
     int cnt = num.size();
     
     if(temp.size()==cnt){
         ret.push_back(temp);
         return;
     }
     for(int i=0;i<cnt;i++){
         if(avl[i] && (i==0 || (num[i]==num[i-1]&& !avl[i-1]) ||(num[i]!=num[i-1]) ) ){
             //forget to consider how about the first layer not work but the second layer work.             
             //to handle this, see if i was used or not           
             //if not use, it means it's a parrale branch
             //otherwise it used
             temp.push_back(num[i]);
             avl[i]=false;
             getPerm(ret,num,temp,avl);
             temp.pop_back();
             avl[i]=true;
         }
         
     }
     
 }
Exemple #5
0
void printPerm(int rank) {
	getPerm(rank) ;
	mapar(perm[rank], (void (*)(void*)) printCell) ;
}