RQNOJ 22 火星人 解题报告

  怎么说呢,都说是全排列,但是我不会(等会儿看看),康拓排序我觉得用不了,因为太大了,long long都装不下,但是m的范围又小,所以可以直接枚举,代码如下:

#include <stdio.h>
#include <stdlib.h>
int num[10000];
int used[10001];
int m, n;
int t;

void output(void)
{
	int i;
	for(i = 0; i < n; i++){
		if(i != 0){
			printf(" ");
		}
		printf("%d", num[i]);
	}
	printf("\n");
	exit(0);
}

void srch(int now, int start)
{
	int i;
	if(now == n){
		if(t == m){
			output();
		}
		t++;
		return;
	}
	for(i = start; i <= n; i++){
		if(!used[i]){
			used[i] = 1;
			num[now] = i;
			srch(now + 1, num[now + 1]);
			used[i] = 0;
		}
	}
	if(now != 0){
		num[now] = num[now - 1] + 1;
	}
	num[now] = 1;
}

int main(int argc, char **argv)
{
	int i;
	scanf("%d%d", &n, &m);
	for(i = 0; i < n; i++){
		scanf("%d", &num[i]);
	}
	srch(0, num[0]);
	return 0;
}

  

posted @ 2011-08-19 21:15  zqynux  阅读(211)  评论(0编辑  收藏  举报