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 */ #...

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

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

全排列POJ1256Anagram

全排列POJ1256Anagram

POJ 1256 Anagram(next_permutation全排列)

题目链接:

POJ1256 Anagram(回溯法)

#include #include #include using namespace std; char str[15]; //存储输入字符串 char out[15]; //存储输出字...

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

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

poj 1256

AnagramTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 13577 Accepted: 5538DescriptionYou ...

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

【题意简述】:本题题意很好理解!题目给出的Hint,使我们对关键点有了更加清晰的认识 An upper case letter goes before the corresponding lower...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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