杭电118(深搜,水题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1181
好久没做搜索题了,就找来几道搜索题做一下,这题完全可以截取每个字符串的首和尾的字符就可以了,我懒得截取就直接开string全部存起来。
这题搜索最主要的剪枝条件就是当前字符串的最后一个字符要和下一步搜索的字符串的第一个字符相同。
这题的输入格式好恶心,看评论知道是只有三个测试样例的。。。。。。。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;  //有多少个单词
bool flag;  //标记,表明是否找到这种方法
string str[1005];  //单词数组
bool vis[1005];   //访问数组
void dfs(int index)
{
	int temp;
	int m=str[index].length()-1;  //求出当前单词的最后一位
	if(str[index][m]=='m')  {  flag=true;  return;  }   //如果当前单词的结尾为m,则找到了,结束程序
	else 
	{
		for(int i=1;i<=2*n;i++)  //从前或者从后遍历每一个单词
		{
			if(i<=n)  temp=i+index;  
			else temp=-(i-n)+index;    //temp取得当前下标
			if(temp>=0&&temp<=n&&!vis[temp]&&str[temp][0]==str[index][m])  //剪枝条件
			{
				vis[temp]=true;  //标记访问过
				dfs(temp);   //进一步深搜
				vis[temp]=false;  //回溯
			}
		}
	}
}
int main()
{
	int t=3;  //例子总数为3
	while(t--)
	{	
	    n=0;
	    while(getline(cin,str[n]))  //输入每个单词
	    {
		    if(str[n]=="0")  break;  //为0结束输入
		    n++;  //单词数加一
	    }
	    n--;
	    flag=false;
	    memset(vis,false,sizeof(vis));
	    for(int i=0;i<=n;i++)
	    {
		    if(str[i][0]=='b')  //每次从开头为b的单词开始深搜
		    {
			    vis[i]=true;  //标记当前访问过
			    dfs(i);  //深搜
			    if(flag)  break;  //如果找到方法,结束
			    vis[i]=false;   //回溯
		    }
	    }
	    if(flag) cout<<"Yes."<<endl;
	    else cout<<"No."<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39905917/article/details/87890627
今日推荐