# POJ 1256 DFS

这道题的排序需要好好想一下，之后的由于序列是无重复的，所以在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 Anagram(回溯法)

#include #include #include using namespace std; char str[15]; //存储输入字符串 char out[15]; //存储输出字...
• SeasonJoe
• 2016年02月17日 21:44
• 811

## POJ - 1256 Anagram

Anagram Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit S...
• qq_18738333
• 2015年03月20日 23:46
• 321

## poj 1256（Anagram）

• sinat_22659021
• 2015年03月18日 23:09
• 374

## poj1256

//============================================================================ // Name : 1256...
• swwlqw
• 2013年10月16日 18:10
• 892

## poj 1256

poj 1256 dfs ＋剪枝 // poj 1256 #include #include #include #include using namespace std; int f...
• Law_light
• 2016年09月22日 22:04
• 111

## POJ1256 && 1979 深搜入门

• Since_natural_ran
• 2016年08月05日 17:20
• 385

## 北大POJ题库使用指南

[转载]北大POJ题库使用指南  (2012-03-30 21:54:45) 转载▼ 标签：  转载 分类： ACM 原文地址：...
• Enjoying_Science
• 2014年11月05日 19:59
• 3365

## poj1256

• u012577123
• 2014年10月24日 20:45
• 501

## POJ1256

• qust1508060414
• 2016年08月19日 23:27
• 112

## poj--1256

Anagram Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18629 Accepted: 7576 Descripti...
• MBLHQ
• 2015年09月21日 20:36
• 152

举报原因： 您举报文章：POJ 1256 DFS 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)