《ACM程序设计》例题解析-PKU1731

本文详细解析了北京大学PKU1731题目的题目大意,分享了解题思路,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PKU1731-Order

题目大意

§ 给一个字符串,长度不超过 200 个字符
§ 求其不重复的全排列
§ 输出不超过 2M 字节

思路

产生含重复元素的全排列
¡
扩展一下 visit 数组的含义,让它记录各种元素和个数
¡ 当剩余的个数大于 0 时才发生递归

代码

#include <functional>
#include <algorithm>
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <cctype>
#include <vector>
#include <string>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <list>
#include <map>
#include <set>
#include <cstdio>
#include <deque>

using namespace std;
 
#define PB push_back
#define MP make_pair
#define FU(i,n) for(i=0;i<n;i++)
#define FD(i,n) for(i=n-1;i>=0;i--)

typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef pair<int,int> PII;
typedef long long LL;
typedef unsigned long long ULL;

pair<char,int> visit[200];
int cnt=0;

void stat(char *a,int n){
	int i,j;
	for(i=0;i<n;i++){
 		for(j=0;j<cnt&&visit[j].first!=a[i];j++);
 		if(j<cnt) visit[j].second++;
 		else{
 			visit[cnt].first = a[i];
 			visit[cnt].second = 1;
 			cnt++;
 		}  
 	}
}

void per(char *a,int k,int n){
	int i,j;
	if(k==n){
		puts(a);
	}
	else{
		for(i=0;i<cnt;i++){
			if(visit[i].second){
				a[k] = visit[i].first;
				visit[i].second--;
				per(a,k+1,n);
				visit[i].second++;
			}
		}
	}
}

int main(){
	int ca,n;
	char a[200];
	gets(a);
	n = strlen(a);
	sort(a,a+n);
	stat(a,n);
	per(a,0,n);
 	
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值