算法--近义词反义词
今天参加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 ,若不符合返回开始出错的行号
例如 :
输入:
3 3
1 2 0
1 3 0
2 3 0
输出 0
输入
3 3
1 2 0
1 3 1
2 3 0
输出 3
这道题其实觉得思路不难,解体思路就是每个单词都有一个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 }