P1019 单词接龙
这道单词拼写真的是很好的搜索题目
还是用DFS进行搜索,用vis[i]表示是否用过,然后进行查找
首先从给定的头开始进行dfs然后进行遍历每个单词
1看这个单词是否用过
2看这个单词是否可以连接上
然后需要暴力一遍长度判断是否可以连接
可以的话就进行连接,然后继续深搜下去
否则话就回溯回来
这里用string类进行加和操作很方便
写判断函数就用我现在连接的这个函数最后k位置去比较如果可以就连接否则就不连接
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; string word[25]; string beging; int ans; int vis[1000]; int n; int add(string &a,string b,int k){ int lenb=b.length(); for (int i=k;i<lenb;i++){ a+=b[i]; } } int check(string a,string b,int k) { int lena=a.length(); for (int i=0; i<k; i++) { if (a[i+lena-k]!=b[i]) { return 0; } } return 1; } void dfs(string a) { int len=a.length(); ans=max(len,ans); for (int i=1; i<=n; i++) { if (vis[i]>=2) { continue; } else { int len2=word[i].length(); for (int j=1; j<=len2; j++) { if (check(a,word[i],j)) { string temp=a; add(temp,word[i],j); if (temp==a) continue; vis[i]++; dfs(temp); vis[i]--; } } } } } int main() { ans=0; scanf("%d",&n); memset(vis,0,sizeof(vis)); for (int i=1; i<=n; i++) { cin>>word[i]; } cin>>beging; dfs(beging); cout<<ans<<endl; return 0; }
有不懂欢迎咨询
QQ:1326487164(添加时记得备注)