2014年12月5日星期五

[UVa] 156 - Ananagrams

要注意的點很多

主要流程:換小寫,字串內排序,比對抽出原字串,原字串互相排序,輸出



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <cstring
#include <iostream>
using namespace std;
int main(){
  //freopen("input.txt", "r", stdin);
  char words[1500][30]; //up to 1000 words and 20 letters.
  char input[30];
  int count=0; //count the number of words
  memset(input,'\0',sizeof(input));
  memset(words,'\0',sizeof(words));

  while(scanf("%s",input)!=EOF){
    if(input[0]=='#'){
        count--;
        break;
    }
    strcpy(words[count],input);
    count++;
    memset(input,'\0',sizeof(input));
  }

  //換小寫
  char words_s[1500][30]={'\0'};
  for(int i=0;i<=count;i++){
    for(int j=0;j<30;j++){
      words_s[i][j]=tolower(words[i][j]);
    }
  }

  //排序
  int flag = 0;
  for(int i=0;i<=count;i++){
    for(int j=0;words_s[i][j]!='\0';j++){
      for(int k=j+1;k<strlen(words[i]);k++){
        if(words_s[i][k]<=words_s[i][j]){ //exchange
          char tmp;
          tmp = words_s[i][k];
          words_s[i][k] = words_s[i][j];
          words_s[i][j] = tmp;
        }
      }
    }
  }    
  //檢查相同
  char words_ok[1500][30];
  int is_ananagram;
  flag=0;
  memset(words_ok,'\0',sizeof(words_ok));
  for(int i=0;i<=count;i++){
    is_ananagram=1;
    for(int j=0;j<=count;j++){
      if(strcmp(words_s[i],words_s[j])==0 && i!=j){
        is_ananagram=0;
        break;
      }
    }
    if(is_ananagram==1 || strlen(words_ok[flag])==1){ //是獨立字或為個別字母
      strcpy(words_ok[flag],words[i]);
      flag++;
    }
  }
  int ok_count = flag; 
  //檢查出來的陣列 words_ok 按照字母排序
  for(int i=0;i<ok_count;i++){
    for(int j=i+1;j<ok_count;j++){
      if(strcmp(words_ok[i],words_ok[j])>0)
      {   char tmp[30];
          strcpy(tmp,words_ok[i]);
          strcpy(words_ok[i],words_ok[j]);
          strcpy(words_ok[j],tmp);
      }
    }
  }


  /*
  for(int i=0;i<=count;i++){
    for(int j=0;words_s[i][j]!='\0';j++)printf("%c",words_s[i][j]);
    printf("\n");
  }
  */

  for(int i=0;i<ok_count;i++){
    //for(int j=0;words_ok[i][j]!='\0';j++)
      printf("%s",words_ok[i]);
    printf("\n");
  }
  return 0;

}

沒有留言: