SSL-ZYC 2433 文件名排序
题目大意:
思路:
纯模拟题!!!
这道题改了我1小时哎呦累死了。
本题AC步骤:
1.读入文件名,查找“.”,把文件名和拓展名记录下来
2.排序(一定一定要把思路想清楚!)
3.输出
这道题细节超级的多,需要加倍注意。(也许用PACSAL会更好打一些?)
代码:
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int n,t[111],d[111],e[111];
string c[111],a[111],b[111]; //不是单身的意思
void poss(int x) //查找小数点
{
for (int i=0;i<=c[x].size()-1;i++) //枚举每个位置
if (c[x][i]=='.')
{
t[x]=1; //有拓展名
for (int j=i+1;j<=c[x].size()-1;j++) b[x]+=c[x][j]; //记录拓展名
return;
}
else a[x]+=c[x][i]; //记录文件名
t[x]=-1; //没有拓展名
}
int Aaa(int x,int y) //判断文件名的大小
{
int a_1=a[x].size();
int a_2=a[y].size();
for (int i=0;i<=min(a_1,a_2)-1;i++) //比较大小
{
if (a[x][i]>a[y][i]) return 1;
if (a[x][i]<a[y][i]) return 0;
}
if (a_1<=a_2) return 0;
return 1;
}
int Bbb(int x,int y) //比较拓展名的大小
{
int a_1=b[x].size();
int a_2=b[y].size();
for (int i=0;i<=min(a_1,a_2)-1;i++) //枚举,比较大小
{
if (b[x][i]>b[y][i]) return 1;
if (b[x][i]<b[y][i]) return 0;
}
if (a_1==a_2) return 2;
if (a_1>a_2) return 1;
return 0;
}
int uuuu(int x,int y) //判断是否要交换(细节多)
{
if (t[x]==-1&&t[y]>=0) return 1; //有拓展名要在没拓展名的前面
if (t[x]==-1&&t[y]==-1) return Aaa(x,y); //两个都没有拓展名比较文件名
if (t[x]>=0&&t[y]==-1) return 0; //前面的有拓展名但后面没有就不用交换
//剩下的就是两个都有拓展名的情况了
if (Bbb(x,y)==1) return 1; //拓展名有区别就交换
if (Bbb(x,y)==2) return Aaa(x,y); //拓展名一样就比较文件名
return 0; //不交换
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
cin>>c[i];
poss(i); //查找小数点
d[i]=i;
}
for (int i=1;i<=n-1;i++)
for (int j=i+1;j<=n;j++) //冒泡排序
if (uuuu(i,j)==1) //要交换
{
string temp;
temp=a[i];a[i]=a[j];a[j]=temp;
temp=b[i];b[i]=b[j];b[j]=temp;
temp=c[i];c[i]=c[j];c[j]=temp;
swap(d[i],d[j]);
swap(t[i],t[j]);
}
for (int i=1;i<=n;i++) e[d[i]]=i;
for (int i=1;i<=n;i++) printf("%d\n",e[i]);
return 0;
}