字母重排问题
关键是对数据的录入,预处理,以及利用qsort进行排序。
#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdlib>
using namespace std;
char word[1010][30], cword[1010][30], sword[1010][30];
int flags[1010];//标记数组
int cmp_word(const void *_a, const void *_b)
{
char *a = (char*)_a;
char *b = (char*)_b;
return *a - *b;
}
int cmp_string(const void *_a, const void *_b)
{
char *a = (char*)_a;
char *b = (char*)_b;
return strcmp(a, b);
}
int main()
{
//freopen("data.txt", "r", stdin);
int c;
int i = 0, j = 0;
while ((c = getchar()) != '#')
{
if(c != ' ' && c != '\n')
word[i][j++] = c;
else
i++, j = 0;//遇到空格和换行符,跳到下一个单词
if(word[i - 1][0] == '\0' && i != 0)//如果是连续的空格,要让i退回上个位置继续记录
i--;
}
int len = i + 1;
//for(int i = 0; i < len; i++)
// printf("%s ", word[i]);
for(int i = 0; i < len; i++)
for(int j = 0; word[i][j] != '\0'; j++)
cword[i][j] = tolower(word[i][j]);
for(int i = 0; i < len; i++)
qsort(cword[i], strlen(cword[i]), sizeof(char), cmp_word);
int m = 0;
for(int i = 0; i < len; i++)
{
int flag = i;//如果word[i]是不可调整构词的,那么flag不会改变
for(int j = 0; j < len; j++)
{
if(i == j)
continue;
if(strcmp(cword[i], cword[j]) == 0)
flag = -1;
}
if(flag != -1)//把符合条件的单词提取出来
strcpy(sword[m++], word[flag]);
}
qsort(sword, m - 1, sizeof(sword[0]), cmp_string);//对答案进行排序
for(int i = 0; i < m - 1; i++)
printf("%s\n", sword[i]);
return 0;
}