题目大意:给一串单词,找出不能依靠变换字母顺序就得到新的单词的单词
解题过程:本次qsort char二维数组成功!!!!
值得注意的是:
int cmpchar(const void * a,const void * b){
return strcmp(*(char(*)[30])a,*(char(*)[30])b);
}
与网上的*(char**)a-*(char**)b不同。我的char二维数组定义为:char (*result)[30]=new char[numofword-start][30];后经过尝试发现:二维数组定义为char result[1005][30]; 应用cmpchar()进行快排也是正确的。
char** p、 char (*p) [n]、char *p[n]是不同的,但是具体哪里不同还在体会中。。。
易错点:由于输入时大小写不限定,有时候会出现 exit 和 Exit的情况,但这种不算字母重组,要去掉
正确代码:
# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>
//*
#define fin cin
#define fout cout
//*/
using namespace std;
/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
int cmp(const void* a,const void * b){
return (*(char*)a)-(*(char*)b);
}
/*
int cmpchar(const void* a,const void*b){
char* sa=(char*)a;
char* sb=(char*)b;
for(int i=0;i<min(strlen(sa),strlen(sb));i++){
if(sa[i]<sb[i]) return -1;
if(sb[i]<sa[i]) return 1;
}
if(strlen(sa)>strlen(sb)) return 1;
if(strlen(sb)>strlen(sa)) return -1;
return 0;
}
void sort(char (*s)[30],int num){
char temp[30];
for(int i=0;i<num;i++){
for(int j=num-1;j>i;j--){
if(cmpchar(s[i],s[j])>0){
strcpy(temp,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],temp);
}
}
}
}
//*/
//*
int cmpchar(const void * a,const void * b){
return strcmp(*(char(*)[30])a,*(char(*)[30])b);
}
//*/
/*
int cmpchar(const void * a,const void * b){
return strcmp(*(char**)a,*(char**)b);
}
*/
struct word{
char origine[30];
char lower[30];
char transf[30];
word(){
strcpy(origine,"");
strcpy(transf,"");
}
void tf(){
for(int i=0;i<strlen(origine);i++){
lower[i]=transf[i]=tolower(origine[i]);
}
transf[strlen(origine)]='\0';
lower[strlen(origine)]='\0';
qsort(transf,strlen(transf),sizeof(transf[0]),cmp);
}
};
word words[1005];
int cmpword(const void * a,const void * b){
if(strcmp((*(word*)a).transf,(*(word*)b).transf)!=0)
return strcmp((*(word*)a).transf,(*(word*)b).transf);
else return strcmp((*(word*)a).lower,(*(word*)b).lower);
}
char result[1005][30];
int main()
{
int numofword=0,numofresult=0;
char temp[30];
fin>>temp;
while(strcmp(temp,"#")!=0){
strcpy(words[numofword].origine,temp);
words[numofword].tf();
numofword++;
fin>>temp;
}
qsort(words,numofword,sizeof(words[0]),cmpword);
for(int i=0;i<numofword-1;){
strcpy(temp,words[i].lower);
for(int j=i;j<numofword-1;j++){
if(strcmp(temp,words[j+1].lower)==0){
strcpy(words[j].transf,"");
strcpy(words[j].lower,"");
}
else{
i=j+1;
break;
}
}
}
qsort(words,numofword,sizeof(words[0]),cmpword);
int start=0;
for(int i=0;i<numofword;i++){
if(strcmp(words[i].transf,"")!=0){
start=i;
break;
}
}
// char *result=new char*[numofword-start];
if(numofword-start==1) fout<<words[start].origine<<endl;
else{
if(strcmp(words[start].transf,words[start+1].transf)!=0){
strcpy(result[numofresult++],words[start].origine);
}
for(int i=start+1;i<numofword-1;i++){
if(strcmp(words[i-1].transf,words[i].transf)!=0&&strcmp(words[i].transf,words[i+1].transf)!=0){
strcpy(result[numofresult++],words[i].origine);
}
}
if(strcmp(words[numofword-2].transf,words[numofword-1].transf)!=0){
strcpy(result[numofresult++],words[numofword-1].origine);
}
}
// sort(result,numofresult);
qsort(result,numofresult,sizeof(result[0]),cmpchar);
for(int i=0;i<numofresult;i++){
fout<<result[i]<<endl;
}
return 0;
}