首页 > 代码库 > 算法--近义词反义词

算法--近义词反义词

今天参加ACM校选,真的是伤心的到绝望,今年就没编过C++,语法都忘得差不多了,弄个helloWordl! 搞了20来分钟,简直日了狗。数组的传递忘干净了(自己太菜,比赛不知为啥死活调用函数时候无法传数组)报错,拿java编代码便习惯了,换到C艹各种艹啊。所以考到一半就放弃了。看着身边的大神一道道做完,自己哎,只做了2道,校选都过不去!!!!!眼睁睁看着题会做,不会用C++在纸上写java代码,心里这个苦。所以要拿c++编代码,用C++,用C++。

  当然今天我还是拿java把这次比赛见到的一个蛮有意思的题实现一下把。

 题目大概是这个意思
 *  近义词反义词 , 规则某单词的近义词的近义词也为近义词,某单词反义词的反义词为近义词。,首先输入两个个数字N T,N代表有N个单词,T 代表下面将有T行数据
 *   每行有三个整行数据  a1,b1,c1 . a1表示第a1个单词, b1表示第b1个单词,c1有两种取值 0与1
 *     0:两个为近义词
 *     1: 两个为反义词
 *  
 *    判断T行数据是否符合逻辑,如果符合逻辑那么返回0 ,若不符合返回开始出错的行号
 

   这道题其实觉得思路不难,解体思路就是每个单词都有一个father,和一堆反义词。

   每读取一行数据时,有两种情况 c1=0 or c1=1

      1. c1=0;    if(  a1的爸爸的反义词库有b1的爸爸||b1的爸爸的反义词库有a1的爸爸)

                                   return  false.

                      else

                          将b1的爸爸的翻译添加道a1的爸爸的反义词库中

                         让b1的爸爸的爸爸 修改为a1的爸爸

                         让所有爸爸是b1爸爸的单词(包括b1) 都改认 a1 爸爸为爸爸

                          return true;

                       

     2. c2=0

               if(a1的爸爸的近义词库有b1的爸爸||b1的爸爸的近义词库有a1的爸爸)

                          return false

              else

               让b1的爸爸的反义词库中  添加 a1的爸爸

               同样a1的爸爸的反义词库中  添加 b1的爸爸

                      return true;

   好了主要的函数写完了,我们看代码的把哈哈哈

 1 import java.util.Scanner; 
 2 public class SynonymOpposite {
 3     static int [][]map;
 4     static int wordFather[];
 5     static StringBuffer wordOpposite[];
 6     static int N;
 7     public static boolean init(int a1,int b1,int c1){
 8         if(c1==0)//jinyici
 9         {
10             if(wordOpposite[wordFather[a1]].indexOf(String.valueOf(wordFather[b1]))!=-1||wordOpposite[wordFather[b1]].indexOf(String.valueOf(wordFather[a1]))!=-1)
11                 return false;
12             else
13             {
14                  int b1Father =wordFather[b1];
15                  for(int i=1;i<=N;i++)
16                  {
17                      if(wordFather[i]==b1Father)//将它链接到a1中去
18                      {
19                          wordFather[i]=wordFather[a1];
20                      }
21                  }
22                  wordOpposite[a1].append(wordOpposite[wordFather[b1]].toString());//同步反义词
23             }
24         }
25         else
26         {
27             if(wordFather[a1]==wordFather[b1])
28             {
29                 return false;
30             }
31             else
32             {
33                 wordOpposite[wordFather[a1]].append(wordFather[b1]);
34                 wordOpposite[wordFather[b1]].append(wordFather[a1]);
35             }
36         }
37         return true;
38     }
39     public static void main(String[] args) {
40         // TODO Auto-generated method stub
41        int col=0;
42        Scanner sc=new Scanner(System.in);
43        N=sc.nextInt();
44        map=new int [N+1][N+1];
45        wordFather=new int [N+1];
46        wordOpposite=new StringBuffer [N+1];
47        for(int i=1;i<=N;i++)
48        {
49            wordFather[i]=i;  
50            wordOpposite[i]=new StringBuffer();
51        }  
52        col=sc.nextInt();
53         int []a1=new int [col+1];
54         int []b1=new int [col+1];
55         int []c1=new int [col+14];
56        for(int i=1;i<=col;i++)
57        {
58            a1[i]=sc.nextInt();
59            b1[i]=sc.nextInt();
60            c1[i]=sc.nextInt();   
61        }
62        int i=0;
63        for( i=1;i<=col;i++)
64        {
65            if(!init(a1[i], b1[i], c1[i]))
66            {
67                System.out.println(i);
68                i=0;
69                break;
70            }
71        }
72       if(i!=0)
73         System.out.println("yes");  
74          
75     }
76 
77 }

 

算法--近义词反义词