64,680
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
using namespace std;
void init(char **tell,int n){ //动态开辟,并初始化
tell=new char*[n];
for(int i=0;i <n;i++){
tell[i]=new char[15];
}
for(int i=0;i <n;i++){
cin>>tell[i];
}
}
void jianhua(char **tell,int n,const int m){
int k=0;
for(int i=0;i <n;i++){ //算法为"黑白逆"
for(int j=0;j <m;j++)
{
if(tell[i][j]=='-')
{
if(tell[i][j+1]!='-')
{
tell[i][k]=tell[i][j+1];
tell[i][j+1]='-';
k++;
}
} //如果找到'-',则将'-'后的非'-'字符赋给'-'所在的位置后其值为'-'
else k++; /////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////此处k会增加到i*j,所以越界访问,自然失败,其它地方没看了
}
}
for(int i=0;i <n;i++){
tell[i][8]='\0';
}
for(int i=0;i <n;i++){
cout <<tell[i] <<endl;
}
for(int i=0;i <n;i++){
for(int j=0;j <8;j++){
switch(tell[i][j]){
case'1':tell[i][j]='1';break; //映射
case'A':
case'B':
case'C':
case'2':tell[i][j]='2';break;
case'D':
case'E':
case'F':
case'3':tell[i][j]='3';break;
case'G':
case'H':
case'I':
case'4':tell[i][j]='4';break;
case'J':
case'K':
case'L':
case'5':tell[i][j]='5';break;
case'M':
case'N':
case'O':
case'6':tell[i][j]='6';break;
case'P':
case'R':
case'S':
case'7':tell[i][j]='7';break;
case'T':
case'U':
case'V':
case'8':tell[i][j]='8';break;
case'W':
case'X':
case'Y':
case'9':tell[i][j]='9';break;
case'0':tell[i][j]='0';break;
case'-':break;
case'\0':break;
default:cout <<"your iuput is wrong" <<endl;
}
}
}
}
void sort(char** tell,int n,int m){//排序
char *temp;
int i,j,k;
for(i=0;i <n-1;i++){
k=i;
for(j=i+1;j <n;j++){
if(strcmp(tell[k],tell[j])>0)k=j;
if(k!=i){
temp=tell[i];
tell[i]=tell[k];
tell[k]=temp;
}
}
}
}
int* delrepate(char **tell,int n){//删除重复字符串
int *temp;
temp=new int[n];
for(int i=0;i <n;i++){
temp[i]=-1;
}
int k=0,q=0; //k用来记录遍历到的字符串,q用来记录删除字符串的个数
for(int i=0;i <n-1-q;i++){
k=i;
for(int j=i+1;j <n-q;j++){
if(strcmp(tell[i],tell[j])==0){
temp[k]++;
q++;
for(int p=k+1;p <=n-q;p++){
tell[p]=tell[p+1];
}
tell[n-q]="\0";//删除一次后表长减1,n-q后的空间是否要释放
j--;
if(j>n-q)break;
}
else temp[k]=0;//temp[k]==o表示没有与tell[k]重复的字符串,==-1表示遍历至此结束
}
}
return temp;
}
int main(){
char**tell;
int n,*p;
int i=0,m=15;
cin>>n;
init(tell,n);
jianhua(tell,n,m);
sort(tell,n,m);
p=delrepate(tell,n);
while(*(p+i)!='-1'){
for(int j=0;j <9;j++){
if(j <3)cout <<tell[i][j];
else if(j==3)cout <<'-';
cout <<tell[i][j-1];
}
if(*(p+i)>0)cout <<" " <<*(p+i) <<endl;
else cout <<endl;
i++;
}
return 0;
}