⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 app.java

📁 寻找灾害连的问题
💻 JAVA
字号:


	import java.util.*;
	import java.util.regex.*;
	
	public class app {

		 private int getString(String string[],String str)   //得到对应的字符串的一个个单独的字符串
		  {
				int num=0;
				String re="[\\u4e00-\\u9fa5]+[a-zA-Z]";  //汉字加字母
				Pattern p=Pattern.compile(re);
				Matcher m=p.matcher(str);
				while(m.find())
				{
					string[num]=str.substring(m.start(), m.end());
					num++;
				}
				return num;
		  }
	 /*
		 private int doSearch(String damagelist[],int listnum,String str,int causenum,String cause[],String result[])
		 //                      灾害链数组           灾害链数组元素个数   原因     原因数            原因元素数组     结果元素数组
		 {
				damagelist[listnum]=str;
				listnum++;
				int[] flag=new int[20];
				for(int i=0;i<causenum;i++)
					flag[i]=0;
				
				for(int j=0;j<causenum;j++)
				{
					if(cause[j].equals(str))
						flag[j]=1;
				}
				
				
				for(int j=0;j<causenum;j++)
				{
					if(flag[j]==1)
					{
						str=result[j];
						System.out.println(str+j);
						return doSearch(damagelist,listnum,str,causenum,cause,result);
					}
					System.out.println("test"+j);
				}
				return listnum;
		 }
	
		 */
		 
		public static void main(String[] args)
		{
			//String[] cause=new String[20];   //灾害链不超过20行
            app ap=new app();
			System.out.println("先输入所有的原因(各个原因间由空格隔开)");
			System.out.println("如灾害产生关系为:");
			System.out.println("灾害a -->灾害b");
			System.out.println("灾害a -->灾害c");
			System.out.println("灾害a -->灾害c   则输入:");
			System.out.println("灾害a 灾害a");
			System.out.println("灾害b 灾害c");
			System.out.println("------------------------------------------------");
		//输入灾害的原因	
			Scanner sc1=new Scanner(System.in);
			String v1,v2,str1,str;
			str1="";
			v1=sc1.nextLine();
			str1=str1+v1;
		//输入灾害的结果	
			System.out.println("再输入原因对应的结果(对应相应的位置,空格隔开):");
			Scanner sc2=new Scanner(System.in);
			str="";
			v2=sc2.nextLine();
			str=str+v2;
			
		//把用空格隔开的原因串和结果串提取出每个单独的串放入原因数组和结果数组
			int causenum,resultnum;
			String cause[]=new String[20];//存放所有的原因
			String result[]=new String[20];//存放所有的结果
			
			causenum=ap.getString(cause, str1);//原因数
			resultnum=ap.getString(result, str);//结果数
			
			if(causenum!=resultnum)
			{
				System.out.println("你输入的灾害产生关系有错误,请确认输入!");
				return;  //结束程序的运行
			}
			else
			{
				System.out.println("------------------------------------------------");
				System.out.println("你所输入的灾害产生关系为:");
				for(int j=0;j<causenum;j++)
				{
					System.out.println(cause[j]+"--->"+result[j]);
				}
			}
			System.out.println("------------------------------------------------");
			
           
			String[][] str2=new String[causenum][2];//二维数组用于存放每行的数据
			for(int i=0;i<causenum;i++)
			{
               str2[i][0]=cause[i];
               str2[i][1]=result[i];
			}
			
			
		    //查看结果是否正确	
			/*
			for(int i=0;i<counter;i++)
			{
				for(int j=0;j<counter;j++)
				{
					System.out.print(str2[i][j]+"   ");
					
				}
				System.out.println();
			}*/
			
			
			System.out.println("你所输入的灾害关系中,包含的灾害链有:");
			
			
	        int[] sign=new int[str2.length];//定义标志数组没有入度的点
	        int[] sign1=new int[str2.length];//定义标志数组没有出度的点
	        int[] count=new int[str2.length]; //统计运行次数
	        
	        
	        
	        //将数组初始化为零
	         
	        for(int i=0;i<str2.length;i++)
	        {
	        	sign[i]=-1;
	        	sign1[i]=0;
	        	count[i]=0;
	        }
	        
	        
	        // 确定没有入度的点
	         
	        for(int i=0;i<str2.length;i++)    //所有没有入度的点标志位都为-1
	        	for(int j=0;j<str2.length;j++)
	        	{
	        		if(str2[i][0].equals(str2[j][1]))
	        		{
	        			sign[i]=0;	
	        		}
	        		else continue;
	        	}
	        //确定没有出度的点
	        
	        for(int i=0;i<str2.length;i++)  //所有没有出度的点标志位都为0
	        	for(int j=0;j<str2.length;j++)
	        	{
	        		if(str2[i][1].equals(str2[j][0]))
	        		{
	        			sign1[i]=1;	
	        		}
	        		else continue;
	        	}
	        
	        
	       //第一次遍历,记录没有遍历到的行
	        for(int i=0;i<str2.length;i++)
	        {
	        	int j=i;
	        	String string="";
	        	if(sign[i]==-1)   //入度为0
	        	{
	        		string=str2[i][0]+"--->"+str2[i][1];
	        	while(sign1[i]!=0)    //该灾害还能导致其他灾害
	        	{
	        		for(int next=0;next<str2.length;next++)
	        		{
	        			if(str2[i][1].equals(str2[next][0]))
	        			{
	        				string=string+"--->"+str2[next][1];
	        				sign[next]++;
	        				i=next;
	        			}
	        		}
	        	}
	        	}
	        	if(!string.equals(""))
	        		System.out.println(string);
	        	i=j;
	        }
	        
	        //第二次遍历
	        int unarrived=0;        //标志没有访问到的数据
	        int first=0;            //标志是第一次访问的数据
	        for(int i:sign)
	        {
	        	if(i==0)
	        		unarrived=1;       // 没访问的为1
	        }
	        while(unarrived==1)
	        {
	        	unarrived=0;
	        	first=0;
	        	 for(int i=0;i<str2.length;i++)
	             {
	             	String string="";
	             	if(sign[i]==-1)
	             	{
	             		string=str2[i][0]+"--->"+str2[i][1];
	             	while(sign1[i]!=0)
	             	{
	             		int[] sign5=new int[str2.length];
	             		for(int intone=0;intone<sign5.length;intone++)
	             		{
	             			sign5[intone]=0;
	             		}
	             		for(int k=0;k<str2.length;k++)
	             		{
	             			if(str2[i][1].equals(str2[k][0])&&sign[k]==0)
	             			{
	             				string=string+"--->"+str2[k][1];
	             				sign[k]++;
	             				i=k;
	             				sign5[k]=1;
	             				first=1;
	             			}
	             		}
	             		for(int k=0;k<str2.length;k++)
	             		{
	             			if(str2[i][1].equals(str2[k][0]))
	             			{ 
	             				if(sign5[k]==1)
	             				{
	             					continue;
	             				}
	             				else
	             				{
	             					string=string+"--->"+str2[k][1];
	             					sign[k]++;
	             					i=k;
	             				}
	             			}
	             		}
	             	}
	             	}
	             	if(first==0)
	             		string="";
	             	else
	             	System.out.println(string);
	             	for(int p:sign)
	                {
	                	if(p==0)
	                		unarrived=1;
	                }
	             }
	        }
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -