程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1002

POJ 1002

編輯:C++入門知識

第一種方法。。較為繁瑣,用字典序寫的,用空間來換時間


[cpp]
#include <iostream>  
#include <cstdio>  
using namespace std; 
typedef struct trietree* Ptree; 
struct trietree 

    bool arrive; 
    int treenum; 
    Ptree next[10]; 
} node[1000000]; 
int size; 
bool findsolve; 
void newtree(int no) 

    int i; 
    node[no].arrive=false; 
    node[no].treenum=0; 
    for(i=0; i<=9; i++) 
    { 
        node[no].next[i]=NULL; 
    } 

int dispose(char *p) 

    int num=0; 
    char *q=p; 
    while(*++p!='\0'); 
    p--; 
    while(p>=q) 
    { 
        if(*p=='-') 
        { 
            p--; 
            continue; 
        } 
        num*=10; 
        if(*p>='A'&&*p<='Y') 
            num+=(*p-'A'-(*p>'Q'))/3+2; 
        else if(*p>='0'&&*p<='9') 
            num+=*p-'0'; 
        p--; 
    } 
    return num; 

void addnum(int num) 

    Ptree p=&node[1]; 
    int i,k; 
    for(i=0; i<=6; i++) 
    { 
        k=num%10; 
        num/=10; 
        if(!p->next[k]) 
        { 
            newtree(++size); 
            p->next[k]=&node[size]; 
        } 
        p=p->next[k]; 
    } 
    p->arrive=true; 
    p->treenum++; 
    return ; 

void dfs(char phone[9],int m,Ptree p) 

    if(true==p->arrive) 
    { 
        if(p->treenum>1) 
        { 
            for(int i=1; i<=7; i++) 
            { 
                if(i==4) 
                    printf("-"); 
                printf("%c",phone[i]); 
            } 
            printf(" %d\n",p->treenum); 
            findsolve=true; 
        } 
        return ; 
    } 
    for(int i=0; i<=9; i++) 
    { 
        if(p->next[i]) 
        { 
            phone[m+1]=i+'0'; 
            dfs(phone,m+1,p->next[i]); 
        } 
    } 
    return ; 

int main() 

    int n,i,j; 
    int number; 
    char phone[9]; 
    char ch[80]; 
    scanf("%d",&n); 
    findsolve=false; 
    size=1; 
    newtree(1); 
    for(i=1; i<=n; i++) 
    { 
        scanf("%s",ch); 
        number=dispose(ch); 
        addnum(number); 
    } 
    dfs(phone,0,&node[1]); 
    if(!findsolve) 
        printf("No duplicates.\n"); 
    return 0; 

#include <iostream>
#include <cstdio>
using namespace std;
typedef struct trietree* Ptree;
struct trietree
{
    bool arrive;
    int treenum;
    Ptree next[10];
} node[1000000];
int size;
bool findsolve;
void newtree(int no)
{
    int i;
    node[no].arrive=false;
    node[no].treenum=0;
    for(i=0; i<=9; i++)
    {
        node[no].next[i]=NULL;
    }
}
int dispose(char *p)
{
    int num=0;
    char *q=p;
    while(*++p!='\0');
    p--;
    while(p>=q)
    {
        if(*p=='-')
        {
            p--;
            continue;
        }
        num*=10;
        if(*p>='A'&&*p<='Y')
            num+=(*p-'A'-(*p>'Q'))/3+2;
        else if(*p>='0'&&*p<='9')
            num+=*p-'0';
        p--;
    }
    return num;
}
void addnum(int num)
{
    Ptree p=&node[1];
    int i,k;
    for(i=0; i<=6; i++)
    {
        k=num%10;
        num/=10;
        if(!p->next[k])
        {
            newtree(++size);
            p->next[k]=&node[size];
        }
        p=p->next[k];
    }
    p->arrive=true;
    p->treenum++;
    return ;
}
void dfs(char phone[9],int m,Ptree p)
{
    if(true==p->arrive)
    {
        if(p->treenum>1)
        {
            for(int i=1; i<=7; i++)
            {
                if(i==4)
                    printf("-");
                printf("%c",phone[i]);
            }
            printf(" %d\n",p->treenum);
            findsolve=true;
        }
        return ;
    }
    for(int i=0; i<=9; i++)
    {
        if(p->next[i])
        {
            phone[m+1]=i+'0';
            dfs(phone,m+1,p->next[i]);
        }
    }
    return ;
}
int main()
{
    int n,i,j;
    int number;
    char phone[9];
    char ch[80];
    scanf("%d",&n);
    findsolve=false;
    size=1;
    newtree(1);
    for(i=1; i<=n; i++)
    {
        scanf("%s",ch);
        number=dispose(ch);
        addnum(number);
    }
    dfs(phone,0,&node[1]);
    if(!findsolve)
        printf("No duplicates.\n");
    return 0;
}

第二種方法,參考別人的代碼~~,map容器實現。。簡單一點


[cpp]
 #include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <set>  
#include <map>  
 
using namespace std; 
 
int num[] = 

    2, 2, 2, 
    3, 3, 3, 
    4, 4, 4, 
    5, 5, 5, 
    6, 6, 6, 
    7, 0, 7, 7, 
    8, 8, 8, 
    9, 9, 9 
}; 
 
map<int, int> s; 
char buf[128]; 
 
int main() 

    int t; 
    scanf("%d", &t); 
    bool flag = false; 
    for(int i = 0; i < t; i++) 
    { 
        scanf("%s", &buf); 
        int c = 0; 
        for(int j = 0; buf[j]; j++) 
        { 
            if(isdigit(buf[j])) 
                c = c * 10 + buf[j] - '0'; 
            else if(isalpha(buf[j])) 
                c = c * 10 + num[ buf[j] - 'A' ]; 
        } 
        s[c]++; 
    } 
    for(map<int, int>::iterator it = s.begin(); it != s.end(); it++) 
        if(it->second > 1) 
        { 
            flag = true; 
            printf("%03d-%04d %d\n", it->first / 10000, it->first % 10000, it->second); 
        } 
    if(!flag) 
        puts("No duplicates."); 
return 0; 

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>

using namespace std;

int num[] =
{
 2, 2, 2,
 3, 3, 3,
 4, 4, 4,
 5, 5, 5,
 6, 6, 6,
 7, 0, 7, 7,
 8, 8, 8,
 9, 9, 9
};

map<int, int> s;
char buf[128];

int main()
{
 int t;
 scanf("%d", &t);
 bool flag = false;
 for(int i = 0; i < t; i++)
 {
  scanf("%s", &buf);
  int c = 0;
  for(int j = 0; buf[j]; j++)
  {
   if(isdigit(buf[j]))
    c = c * 10 + buf[j] - '0';
   else if(isalpha(buf[j]))
    c = c * 10 + num[ buf[j] - 'A' ];
  }
  s[c]++;
 }
 for(map<int, int>::iterator it = s.begin(); it != s.end(); it++)
  if(it->second > 1)
  {
   flag = true;
   printf("%03d-%04d %d\n", it->first / 10000, it->first % 10000, it->second);
  }
 if(!flag)
  puts("No duplicates.");
return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved