您的位置:首页 > 其它

dfs(简单例题)

2015-08-04 23:33 225 查看
基本思想:从初始状态S开始,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态G,若未出现,以此状态利用规则生成再下一层任一个结点,再检查是否为目标节点G,若未出现,继续以上操作过程,一直进行到叶节点(即不能再生成新状态节点),当它仍不是目标状态G时,回溯到上一层结果,取另一可能扩展搜索的分支。生成新状态节点。若仍不是目标状态,就按该分支一直扩展到叶节点,若仍不是目标,采用相同的回溯办法回退到上层节点,扩展可能的分支生成新状态,…,一直进行下去,直到找到目标状态G为止

/*hdu--变形课*/

#include<stdio.h>
#include<string.h>
struct stu
{
char x;
char y;
}point[1000];
int head[1000];
int k;
int flag;
void find(char c)
{
int i;
char temp;

if(c=='m')
{
flag=1;
return;
}//如果找到了,直接回溯,不需要再向右移动
for(i=1;i<k;i++)
{
if(head[i]==0&&point[i].x==c)
{
temp=c;
c=point[i].y;
head[i]=1;//标记已经找过得
find(c);
head[i]=0;//回溯取消标记,根据题意,此处也可以删去,(模板为需要);
c=temp;
}
}
}
int main()
{
char a[100];
int i,l;
k=1;
while(gets(a)!=NULL)
{
if(strcmp(a,"0")==0)
{
flag=0;
find('b');
if(flag)printf("Yes.\n");
else printf("No.\n");
k=1;
}
else
{
l=strlen(a);
point[k].x=a[0];
point[k].y=a[l-1];
head[k++]=0;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: