洛谷 P1109单词接龙

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beastbeast和astonishastonish,如果接成一条龙则变为beastonishbeastonish,另外相邻的两部分不能存在包含关系,例如atat 和 atideatide 间不能相连。

输入格式

输入的第一行为一个单独的整数nn (n \le 20n≤20)表示单词数,以下nn 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

输出格式

只需输出以此字母开头的最长的“龙”的长度

输入输出样例

输入 #1

5
at
touch
cheat
choose
tact
a

输出 #1

23

说明/提示

(连成的“龙”为atoucheatactactouchoose)

NOIp2000提高组第三题

思路:深度优先搜索,根据题意,先选出包含最后一个字母的单词,然后进行搜索
小细节:每个单词最多出现两次,相连的单词重合的部分可能不止一个单词,也许是俩个单词或者是多个单词

import java.util.Scanner;

public class Main {

	int res = 0;
	/**
	 * 搜索最长的字符串
	 * @param str	当前的龙
	 * @param s		可以选择的字符串
	 * @param b		字符数组已经选过的次数
	 * @return		最长接龙的长度
	 */
	public int dfs(String str, String[] s, int[]b) 
	{
		int ans = str.length();
		int maxn = ans;
		for(int i = 0; i < s.length; i++) {
			if(b[i] < 2 ) {//最多取俩次(如果还能取)
				for(int j = 0; j <= Math.min(s[i].length() - 1,str.length() - j - 1); j++) {/*重合的字母个数*/
								//str长度:str.length()   要取最后j个字母 从str.length()
					String a = s[i].substring(0, j + 1);//s[i]的前j位
					String c = str.substring(str.length() - j - 1);//字符串的后j位
					//不能用a == c
					if(a.equals(c)){
						b[i] ++;
						str = str + s[i].substring(j + 1);//接上去
						
						maxn = Math.max(maxn, dfs(str, s, b));//搜索
					
						b[i] --;//把接上去的拿回来
						str = str.substring(0, str.length() - s[i].length() + j + 1);
					}
				}
			}
		}
		return maxn;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		String str = in.nextLine();
		String[] s = new String[n];
		for (int i = 0; i < n; i++) {
			s[i] = in.nextLine();
		}

		// 龙开头的字母
		char c = in.nextLine().charAt(0);
		int[] b = new int[n];//记录当前单词使用次数

		int maxn = 1;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				b[j] = 0;// 都没用过
			}

			if (s[i].charAt(0) == c) {//当前单词的首字母是输入的最后一个字母
				b[i] = 1;// b[i]用过一次
				maxn = Math.max(maxn, new Main().dfs(s[i], s, b));
			}
		}
		System.out.print(maxn);
	}
}

你可能感兴趣的:(DFS,回溯,洛谷)