uva10132 字符串数组的qsort排序技巧

2014-11-24 02:27:48 · 作者: · 浏览: 3
首先声明uva服务器又崩了,没有提交所以不知道这道题能否AC,思路可以参考一下,不难。
因为文件都相同,且恰好分成两部分,所以我先将所有字符串按长度排序,最短串和最长串组成的一定是源文件!如果有多个最短串和最长串,就要排列组合去试了。
在编写qsort的比较函数时遇到了问题,百度后解决了,最主要就是*(char**)这里,容易写错,如果只写char*,那是指向字符的指针,char**才是指向指针的指针,指向的是一个地址,字符串的首地址。
qsor函数中的第三个参数要写每个待排序元素的大小,我看网上有两个版本,可以写sizeof(char*),也可以写sizeof(str【0】),试过了都可以运行。
代码有点长,就是穷举地去试的,没想到好办法。。。
#include  
#include  
#include  
#include  
#include  
  
using namespace std;  
  
const int SIZE = 256;  
char* str[300];  
int cases,Len,dex;  
bool flag,vis[SIZE];  
int cmp(const void* a,const void* b)  
{  
    return strlen(*(char**)a)>strlen(*(char**)b);  
}  
void judge(char tar[])  
{  
    for (int i=1;ii;j--)  
                {  
                    if (strlen(str[i])+strlen(str[j])i;j--)  
                {  
                    if (strlen(str[i])+strlen(str[j])
>cases; getchar();getchar(); while(cases--) { dex=0; str[dex]= new char [SIZE]; while (cin>>str[dex++]) { str[dex]=new char[SIZE]; } qsort(str,dex,sizeof(str[0]),cmp); int lenshort=strlen(str[1]); int lenlong=strlen(str[dex-1]); Len=lenshort+lenlong; for (int i=1;i<=dex/2;i++) { if (flag) break; if (strlen(str[i])==lenshort) { for (int j=dex-1;j>=1;j--) { if (strlen(str[j])==lenlong) { solve(i,j); if (flag) break; } else break; } } else{ cout<<"NO"<