POJ 1256 DFS

原创 2012年03月22日 15:53:59

      这道题的排序需要好好想一下,之后的由于序列是无重复的,所以在dfs的时候需要特殊处理一下即可。题目:

Anagram
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 14869   Accepted: 6085

Description

You are to write a program that has to generate all possible words from a given set of letters. 
Example: Given the word "abc", your program should - by exploring all different combination of the three letters - output the words "abc", "acb", "bac", "bca", "cab" and "cba". 
In the word taken from the input file, some letters may appear more than once. For a given word, your program should not produce the same word more than once, and the words should be output in alphabetically ascending order. 

Input

The input consists of several words. The first line contains a number giving the number of words to follow. Each following line contains one word. A word consists of uppercase or lowercase letters from A to Z. Uppercase and lowercase letters are to be considered different. The length of each word is less than 13.

Output

For each word in the input, the output should contain all different words that can be generated with the letters of the given word. The words generated from the same input word should be output in alphabetically ascending order. An upper case letter goes before the corresponding lower case letter.

Sample Input

3
aAb
abc
acba

Sample Output

Aab
Aba
aAb
abA
bAa
baA
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa

Hint

An upper case letter goes before the corresponding lower case letter. 
So the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'.
ac代码:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int len;
char ch[15],ss[15];
int visted[15];
bool cmp(char a,char b){
  double t1=a,t2=b;
  if(a>='A'&&a<='Z') t1+=31.5;
  if(t2>='A'&&t2<='Z') t2+=31.5;
  return t1<t2;
}
void dfs(int x){
	if(x==len){
	  char str[15];
	  for(int i=0;i<len;++i)
		  //str[i]=ch[i];
	  //str[len]='\0';
	  printf("%c",ch[i]);
	  printf("\n");
	}
	else{
		for(int i=0;i<len;++i){
			if(!visted[i]){
			  ch[x]=ss[i];
			  visted[i]=1;
			  dfs(x+1);
			  visted[i]=0;
			  while(i+1<len&&ss[i+1]==ss[i])i++;
			}
		}
	}
}
int main(){
  int numcase;
  scanf("%d",&numcase);
  while(numcase--){
	memset(visted,0,sizeof(visted));
    ss[15];
	scanf("%s",ss);
	len=strlen(ss);
    sort(ss,ss+len,cmp);
	dfs(0);
  }
  return 0;
}


poj1256 dfs(全排列)

题意:给定字符串(长度最大为13),字母可能有重复,要求按升序输入其所有的全排列,注意,字母的大小顺序为A 算法: 1.dfs  2.STL /* 算法:dfs */ #...
  • aidway
  • aidway
  • 2016年03月06日 18:19
  • 151

POJ 1833 1146 1256 全排列系列 next_permutation函数

next_permutation函数应用于全排列序列问题

POJ3373-Changing Digits【DFS+强剪枝】

  • 2011年08月19日 00:44
  • 12KB
  • 下载

poj2488——dfs深度优先遍历

  • 2013年07月24日 10:21
  • 2KB
  • 下载

POJ 1256 Anagram(输入可重集枚举排序)

【题意简述】:本题题意很好理解!题目给出的Hint,使我们对关键点有了更加清晰的认识 An upper case letter goes before the corresponding lower...

poj 1256(Anagram + 求全排列算法)

题目链接:http://poj.org/problem?id=1256       题目意思:一串字符a[15],要求求出所有有这些字符构成的不重复的字符串(全排列问题)       代码借鉴于大...
  • kath_y
  • kath_y
  • 2012年04月21日 00:28
  • 425

poj 1256

 AnagramTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 13577 Accepted: 5538DescriptionYou...
  • fp_hzq
  • fp_hzq
  • 2011年04月28日 19:37
  • 729

poj 1256 Anagram

#include #include #include char a[20]; int len; int cmp(const void *a,const void *b)//排序用 { int c,d...

【STL】poj 1256 Anagram

next_permutation函数的应用

(Relax ST1.7)POJ 1256 Anagram(求一个字符串在特殊规定下的全排列)

在做POJ1256时牵扯问题如下。按要求(并不是传统的字典序)排序,然后调用next_permutation即可。 先说说什么是字典序:官方的定义比较复杂,其实故名思议可以想象咱们英语字典中的单...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1256 DFS
举报原因:
原因补充:

(最多只允许输入30个字)