POJ3083 children of rhe candy corn

编程入门 行业动态 更新时间:2024-10-12 01:30:03

POJ3083 <a href=https://www.elefans.com/category/jswz/34/1739488.html style=children of rhe candy corn"/>

POJ3083 children of rhe candy corn

题目大意:就是求最左优先,最右优先的路径长度(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;}

 

更多推荐

POJ3083 children of rhe candy corn

本文发布于:2024-02-25 13:06:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1699065.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:children   rhe   corn   candy

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!