紫书章五例题八 命令 UVA 400 (排序+结构体)

来源:互联网 发布:同花顺炒股软件收费 编辑:程序博客网 时间:2024/05/21 17:26

题意:将一些字符串按照字典从左到右,从上到下输出,假设最长的字符串长度为M,则最后一列为M个字符,其它列为M+2个字符。
这个题我用了一个结构体。然后就出现了一个存字符串的数组,为什么呢,因为如果声明一个二维数组的话,那么排序就不好用了。如果用set存的话,之后查找的话,就比较麻烦。

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <vector>#include <set>using namespace std;struct node{    char s[65];};node f[105];int vis[105];//里面存对应字符串的长度,避免重复计算bool cmp(node a,node b){    return strcmp(a.s,b.s)<0;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int MAX=0,wz=0;        memset(f,0,sizeof(f));        memset(vis,0,sizeof(vis));        for(int i=0;i<n;i++)        {            scanf("%s",f[i].s);            int len=strlen(f[i].s);            if(MAX<strlen(f[i].s))                MAX=strlen(f[i].s);        }        sort(f,f+n,cmp);        int c=(60-MAX)/(MAX+2)+1;        int r=(n+c-1)/c;        int total=1,flag=0,h=0;        for(int i=0;i<n;i++)            vis[i]=strlen(f[i].s);       printf("------------------------------------------------------------\n");        for(int i=0;i<r;i++){            for(int j=0;j<c;j++){//输出,按行输出                int k=j*r+i;                cout<<f[k].s;                int g=vis[k];                int cd=MAX+2;                if(j==c-1) cd=cd-2;//最后一列MAX                while(g<cd)                {printf(" ");g++;}            }            printf("\n");        }    }    return 0;}
0 0
原创粉丝点击