2020.4.11——单词接龙(递归回溯,注意细节)

知识点:

  1. 递归回溯
  2. 细节题

代码如下:

package 算法训练;

import java.util.Scanner;

public class 成语接龙 {
	static int n,max=0;
	static String[] a;
	static int[] a_ok;//存放字符串使用次数
	static StringBuffer sb=new StringBuffer();
	public static void main(String args[])
	{
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		String m;
		char c;
		a=new String[n];
		a_ok=new int[n];
		String[][] b=new String[n][n];//存放两两字符是否可以连接,可以则存放将连接的字符,不可以则存放null;
		for(int i=0;i0&&b[col][i]!=null)//如果该字符还可以使用并且该字符可以连接
			{
				--a_ok[i];
				sb.append(s);
				count++;
				f(b,i);//递归判断下一个
				++a_ok[i];//回溯
				sb.delete(l,sb.length());//回溯
			}
		}
		if(count==0)
		{
			if(sb.length()>max)
			{
				max=sb.length();
			}
			return;
		}
		
	}

	private static String check(String a,String b) {
			if(a.indexOf(b)!=-1&&a.length()>b.length())//如果a单词包含但不等于b单词(如果a=b=eme,是可以连接的),不能连接
			{
				return null;
			}
			int count=a.length()-1;//从a字符的后面开始看,一碰到可以与后面字符连接的条件,则就断开,这样才能形成最大的连接
			while(count>=0&&a.length()-count<=b.length())//保证不会越界
			{
	
				if(a.substring(count,a.length()).equals(b.substring(0,a.length()-count)))
				{
					return b.substring(a.length()-count);
				}
				count--;
			}
			return null;
		}	
}

你可能感兴趣的:(蓝桥杯)