算法竞赛入门经典:第五章 基础题目选解 5.8 字母重排

来源:互联网 发布:c语言中的const 编辑:程序博客网 时间:2024/05/14 02:40
/*字母重排:输入一个字典(用******结尾),然后再输入若干单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典顺序从小到大的顺序在一行中输出(如果不存在,输出:( )。输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成。注意,字典中的单词不一定按字典序排列输入:trap given score refund only trap work earn course pepper part******resco nfudre aptr sett oresuc输出:scorefefundpart tarp trap:(course思路:其实是输入的单词的全排列,n个单词有n!种组合,然后将n!个新单词在字典中去搜一把,凡是搜到的就输出字典中的单词关键是确定全排列,例如resco,第一层从5个中选一个单词,第二层从剩余4个中选一个单词,关键是怎么选,可以用减枝标记,凡是选了的就不能再选不需要搞全排列,可以将字典中单词排序,输入的单词也排序,两者比较相等,说明输入的单词已经在字典中了考虑,有的单词输入都一样1 <stdlib.h>中的排序函数,void qsort(const void* buffer,size_t num,size_t size,int(* compare)(const void*,const void*))2 注意输出的顺序必须按照字典顺序,也就是说原来的输入字符串顺序也要先排 qsort(strDic,iCount,sizeof(strDic[0]),comp_str);                                                                       qsort(strWord[j],strlen(strWord[j]),sizeof(char),comp_char);  //比较的时候,字符串数组的个数为计数器的值,而每个字符数组的大小可用第一个字符数组大小表示3 int comp_str(const void* _a,const void* _b)//注意函数指针必须是与sort函数中const void*形参相同4 //iCount--;因为最后一次iCount累加没有加上5 while(EOF != scanf("%s",strDic[iCount]))//scanf会过滤空格  */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#define MAXSIZE 100using namespace std;//int comp_str(const char* _ptrStrA,const char* _ptrStrB)int comp_str(const void* _a,const void* _b)//注意函数指针必须是与sort函数中const void*形参相同{char* pA = (char*) _a;char* pB = (char*) _b;return strcmp(pA,pB);}//int comp_char(const char* _a,const char* _b)int comp_char(const void* _a,const void* _b){char* a = (char*)_a;char* b = (char*)_b;return(*a - *b);}void input(){char strDic[MAXSIZE][7];//原有字典char str[MAXSIZE][7];//辅助数组,存放已经排序过的字典char strWord[MAXSIZE][7];int iCount = 0;while(EOF != scanf("%s",strDic[iCount]))//scanf会过滤空格{if(!strcmp("******", strDic[iCount]))//字符数组的比较不能用"******" == strDic[iCount]直接比较,必须用strcmp{break;}//对输入的单词排序//strcpy(str[iCount],strDic[iCount]);//sort(str[iCount],str[iCount] + strlen(str[iCount]));//qsort(str[iCount],strlen(str[iCount]),sizeof(char),comp_char);iCount++;}//单词组顺序进行排序//iCount--;因为最后一次iCount累加没有加上//sort(strDic,strDic + iCount);qsort(strDic,iCount,sizeof(strDic[0]),comp_str);//比较的时候,字符串数组的个数为计数器的值,而每个字符数组的大小可用第一个字符数组大小表示//拷贝后,再对每个单词进行排序for(int q = 0 ; q < iCount ; q++){strcpy(str[q],strDic[q]);sort(str[q],str[q] + strlen(str[q]));}//接下来对每个输入的单词进行判断int j = 0;while(EOF != scanf("%s",strWord[j])){//sort(strWord[j],strWord[j] + strlen(strWord[j]));qsort(strWord[j],strlen(strWord[j]),sizeof(char),comp_char);j++;}for(int m = 0; m < j;m++){bool isFind = false;for(int k = 0; k < iCount;k++){if(!strcmp(strWord[m],str[k])){printf("%s ",strDic[k]);isFind = true;//break;//因为还有单词会相同}}if(!isFind){printf("%s",":(");}printf("\n");}}int main(int argc,char* argv[]){input();system("pause");return 0;}

0 0
原创粉丝点击