POJ3083 children of rhe candy corn

本文探讨了迷宫中寻找从起点到终点路径的问题,详细介绍了两种深度优先搜索(DFS)策略——最左优先和最右优先,以及一种广度优先搜索(BFS)策略。通过对比不同搜索方式的特点,展示了如何实现这些算法并分析了它们的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:就是求最左优先,最右优先的路径长度(DFS不唯一),求最短路径(BFS唯一)

思路:代码TIE了,欲哭无泪,只好先放放,哪位大牛可以帮忙看看,怎么改进。。555

program:

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h> 
using namespace std;
char map[41][41];
int flag[41][41];
int lm[4][2]={{0,-1},{-1,0},{1,0},{0,1}};
int rm[4][2]={{0,1},{-1,0},{1,0},{0,-1}};
int si,sj,ei,ej;
int m,n,cnt;
struct ditu
{
   char ch;
   int i,j;
   int d;      
}bfs_map[41][41];
int dfs_l(int i,int j)
{
// cout<<"ij  "<<i<<' '<<j<<" cnt "<<cnt<<endl;
  flag[i][j]=1;
  if(i==ei&&j==ej)  return cnt;
  for(int k=0;k<4;k++)
//注意这里<N,不能等于n ,机子发现不了的额,
//因为开的数组往往足够大啊
     if(i+lm[k][0]>=0&&i+lm[k][0]<n&&j+lm[k][1]>=0&&j+lm[k][1]<m&&map[i+lm[k][0]][j+lm[k][1]]!='#'&&!flag[i+lm[k][0]][j+lm[k][1]]) // 
      {           
        cnt++;
        if( dfs_l(i+lm[k][0],j+lm[k][1]))return cnt;
      }
  flag[i][j]= 0;
  cnt++;//返回的过程也加
  return 0;                 
}
int dfs_r(int i,int j)//
{
  //cout<<"ij  "<<i<<' '<<j<<" cnt "<<cnt<<endl; 
  flag[i][j]=1;
  if(i==ei&&j==ej)  return cnt;
  for(int k=0;k<4;k++)
     if(i+rm[k][0]>=0&&i+rm[k][0]<n&&j+rm[k][1]>=0&&j+rm[k][1]<m&&map[i+rm[k][0]][j+rm[k][1]]!='#'&&!flag[i+rm[k][0]][j+rm[k][1]]) // 
      {           
        cnt++;
        if( dfs_r(i+rm[k][0],j+rm[k][1]))return cnt; //一开始调用的竟然是左函数
      }
  flag[i][j]= 0;
  cnt++;
  return 0;                 
}
int bfs()
{
   queue<ditu>que;
   bfs_map[si][sj].d=1;
   que.push(bfs_map[si][sj]);
   flag[si][sj]=1;
   while(!que.empty())
   {
     ditu tmp=que.front();
     que.pop();
     for(int i=0;i<4;i++)
     {
       if(tmp.i+lm[i][0]>=0&&tmp.i+lm[i][0]<n&&tmp.j+lm[i][1]>=0&&tmp.j+lm[i][1]<m&&bfs_map[tmp.i+lm[i][0]][tmp.j+lm[i][1]].ch!='#'&&!flag[tmp.i+lm[i][0]][tmp.j+lm[i][1]])       
          {
             bfs_map[tmp.i+lm[i][0]][tmp.j+lm[i][1]].d=tmp.d+1;
             flag[tmp.i+lm[i][0]][tmp.j+lm[i][1]]=1;
             que.push(bfs_map[tmp.i+lm[i][0]][tmp.j+lm[i][1]]);
             if(tmp.i+lm[i][0]==ei&&tmp.j+lm[i][1]==ej)
               return  bfs_map[tmp.i+lm[i][0]][tmp.j+lm[i][1]].d;                                                                                                                                                              
          }    
     }                  
   } 
}

int main()
{
int test;
scanf("%d",&test);
while(test--)

   char tmp;
   scanf("%d%d",&m,&n);
//之所以会乱码,因为下面输入的时候没行末都有一个回车
//一开始的n,m在2个dfs都搞错顺序了,擦
//尼玛的m,n顺序搞错了,一开始的时候
//注意n是行,m是列
//我嚓,注意啊,dfs的数据不唯一啊
   memset(map,0,sizeof(map));
   memset(bfs_map,0,sizeof(bfs_map));// 
   for(int i=0;i<n;i++)
   {
//scanf("%c",&tmp);//or use getchar();
//把除了最后一行的回车都输进这里啊,鸟~~~
        getchar();
        for(int j=0;j<m;j++)
        {
         
          scanf("%c",&map[i][j]);
          bfs_map[i][j].ch=map[i][j];
          bfs_map[i][j].i=i;
          bfs_map[i][j].j=j;
          if(map[i][j]=='S')
          {  
             si=i;
             sj=j; 
          }
          else if(map[i][j]=='E')
          {
             ei=i;
             ej=j;   
          }     
        }
   }
/*   for(int i=0;i<n;i++)
   {
       
           for(int j=0;j<m;j++)
               printf("%c",map[i][j]);
           printf("\n"); 
   } */  
 //  cout<<"                 SiSj  "<<si<<' '<<sj<<"         eiej "<<ei<<' '<<ej<<endl;
   cnt=1;
   memset(flag,0,sizeof(flag));
   dfs_l(si,sj);  printf("%d ",cnt);//cout<<cnt<<' ';
   
   cnt=1;
   memset(flag,0,sizeof(flag));
   dfs_r(si,sj);  printf("%d ",cnt);//cout<<cnt<<' ';
  
   memset(flag,0,sizeof(flag));
   printf("%d\n",bfs());//cout<<bfs()<<endl;
   
      
}   
system("pause");
return 0;}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值