poj1573_搜索(广搜和深搜)

点击打开题目链接

其实深搜和广搜都一样,没有太大的差别,因为每次都是只走了一个


深搜:

#include<stdio.h>
#include<string.h>
int book[100][100];
char map[100][100];

int s;
int n,m,count,flag;
void dfs(int c,int r)
{
	
    
	
	if(book[c][r])
	 {
	 	flag=1;	
		s=book[c][r]-1; 	
	 	return;
	 } 
	  
	if(c<1||c>n||r<1||r>m)
	{
		
		   return;
	}
	
	
	count++;
	book[c][r]=count;
   
    
    if(map[c][r]=='N')
       dfs(c-1,r);
    else if(map[c][r]=='S')
	   dfs(c+1,r);
	else if(map[c][r]=='E')
	   dfs(c,r+1);
	else if(map[c][r]=='W')
	    dfs(c,r-1);	

}
int main()
{
	int k,i,j;
	while(scanf("%d%d%d",&n,&m,&k)&&n+m+k)
	{
		
	flag=0;
	memset(book,0,sizeof(book));
    count=0;
    
	getchar();
	for(i=1;i<=n;i++)
	{
		 for(j=1;j<=m;j++)
	       scanf("%c",&map[i][j]);
	          getchar();
	}
	

	
	dfs(1,k);
	if(flag)
	   printf("%d step(s) before a loop of %d step(s)\n",s,count-s);
	else
	  printf("%d step(s) to exit\n",count);
	  
   }
	return 0;
} 
广搜;

#include<stdio.h>
#include<queue> 
#include<string.h>
using namespace std;

struct node{
	
	int r,c;
	node(int c1,int r1):c(c1),r(r1){
	}
	
};
int book[100][100];
char map[100][100];

int s;
int n,m,k,count,flag;
void bfs()
{

	queue<node>q;
  	q.push(node(1,k));
  	
    while(!q.empty())
    {
	  node now=q.front();
	   q.pop();
	   	   	
	if(book[now.c][now.r])
	 {
	 	flag=1;	
		s=book[now.c][now.r]-1; 	
	 	return;
	 } 
	  
	if(now.c<1||now.c>n||now.r<1||now.r>m)
	{
		
		   return;
	}
	
	
	count++;
	book[now.c][now.r]=count;
	
    	if(map[now.c][now.r]=='N')
          q.push(node(now.c-1,now.r));
    else if(map[now.c][now.r]=='S')
	   q.push(node(now.c+1,now.r));
	else if(map[now.c][now.r]=='E')
	   q.push(node(now.c,now.r+1));
	else if(map[now.c][now.r]=='W')
	    q.push(node(now.c,now.r-1));	
    }
    

}
int main()
{
	int i,j;
	while(scanf("%d%d%d",&n,&m,&k)&&n+m+k)
	{
		
	flag=0;
	memset(book,0,sizeof(book));
    count=0;
    
	getchar();
	for(i=1;i<=n;i++)
	{
		 for(j=1;j<=m;j++)
	       scanf("%c",&map[i][j]);
	          getchar();
	}
	

	
	bfs();
	if(flag)
	   printf("%d step(s) before a loop of %d step(s)\n",s,count-s);
	else
	  printf("%d step(s) to exit\n",count);
	  
   }
	return 0;
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值