E - Children of the Candy Corn`特别DFS+BFS+DFS陷阱

来源:互联网 发布:管家婆普及版数据恢复 编辑:程序博客网 时间:2024/06/06 01:43
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include<queue>
#include <iostream>
using namespace std;
int w,h;
char map[41][41]; 
char map1[41][41]; 
char map2[41][41]; 


int ok;
int xx[]={9,0 ,-1, 0, 1};       //左,上 右 下
int yy[]={9,-1, 0, 1, 0};


int ldx1[]={9, 1 , 0 ,  -1               };   //下 左 上
int ldy1[]={9, 0 ,-1 ,   0               };  


int ldx2[]={9, 0 , -1 ,   0               };
int ldy2[]={9,-1 ,  0 ,   1               };    //左上 右


int ldx3[]={9, -1 ,   0 ,   1               };
int ldy3[]={9,  0 ,   1 ,   0               };     //上 右 下


int ldx4[]={9,  0 ,   1 ,   0               };     //右 下 左
int ldy4[]={9,  1 ,   0 ,  -1               };  








int rdx1[]={9,-1 , 0 ,   1               };
int rdy1[]={9, 0 ,-1 ,   0               };     // 上 左 下


int rdx2[]={9, 0 , -1 ,   0               };
int rdy2[]={9, 1 ,  0 ,  -1               };     // 右上左


int rdx3[]={9,  1 ,   0 ,  -1               };
int rdy3[]={9,  0 ,   1 ,   0               };        // 下右 上 


int rdx4[]={9,  0 ,   1 ,   0               };
int rdy4[]={9, -1 ,   0 ,   1               };      //  左 下 右 








struct node   
{
int x,y;
}; 


queue <node> qq;
node point;


node track[1600][1600];


int lk,rk,bk,lsign,rsign;
int startx,starty,endx,endy;
int main()
{
int is_board(int r, int c);
    int ldfs(int r,int c,int posi);
    int rdfs(int r,int c,int posi);
int bfs(int r, int c);
    int  countt(node  a);

int i,j,t;

scanf("%d",&t);

int posi;
while(t--)
{
// memset(track,0,sizeof(track));    由于用不到这么多。如果memset了相当于全部用了,用来填零,造成内存急剧增加


scanf("%d%d",&w,&h);


getchar(); 



while ( !qq.empty())
{
qq.pop();  
}

for (i=1;i<=h;i++)
{
for (j=1;j<=w;j++)
{
scanf("%c",&map[i][j]);
map1[i][j]=map[i][j];
map2[i][j]=map1[i][j];
if (map[i][j]=='S') {startx=i; starty=j; }

if (map[i][j]=='E') { endx=i; endy=j;}


}
getchar();
}

for (i=1;i<=4;i++)
{
if (is_board(startx+xx[i],starty+yy[i])  &&   map[startx+xx[i]][starty+yy[i]]=='.' )

posi=i;


}

lk=0;
lsign=0;
  ldfs(startx,starty,posi);

rk=0;
rsign=0;
rdfs(startx,starty,posi);


bk=0;
ok=0;
point.x=startx;
point.y=starty;

node endd;
endd.x=endx;
endd.y=endy;
qq.push(point);


bfs(startx,starty);

countt(endd);


printf("%d %d %d\n",lk+2,rk+2,bk);



}

return 0;





int is_board(int r, int c)
{

if ( r>=1 && r<=h && c>=1 && c<=w) return 1;
return 0;
}




int ldfs(int r,int c,int posi)


int ldx[5];
int ldy[5];


int i;
if (map[r][c]=='E') {lsign=1;return 0;}

if  (lsign==1) return 0;

if (posi==1)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx1[i];
ldy[i]=ldy1[i];


}
if (posi==2)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx2[i];
ldy[i]=ldy2[i];


}
if (posi==3)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx3[i];
ldy[i]=ldy3[i];


}
if (posi==4)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx4[i];
ldy[i]=ldy4[i];


}


for (i=1;i<=3;i++)
{
if (  is_board(r+ldx[i],c+ldy[i]) && map[r+ldx[i]][c+ldy[i]]=='.' ||map[r+ldx[i]][c+ldy[i]]=='E')
{
if (map[r+ldx[i]][c+ldy[i]]=='E') {lsign=1;return 0;}

if   (ldx[i]==0  &&   ldy[i]==-1 ) posi=1;
if   (ldx[i]==-1 &&   ldy[i]== 0 ) posi=2;
if   (ldx[i]==0  &&   ldy[i]== 1 ) posi=3;
if   (ldx[i]==1  &&   ldy[i]== 0 ) posi=4;




 
// map[r+ldx[i]][c+ldy[i]]='#';    //因为此处没屏蔽  一直tle!!!!!!!!!!!

lk++;

ldfs(r+ldx[i],c+ldy[i],posi);
if  (lsign==1) return 0;
// map[r+ldx[i]][c+ldy[i]]='.';      //因为此处没屏蔽  一直tle!!!!!!!!!!!

lk++;


}
}





return 0;
}


int rdfs(int r,int c,int posi)

int rdx[5];
int rdy[5];

int i;
if (map1[r][c]=='E') {rsign=1;return 0;}

if  (rsign==1) return 0;


if (posi==1)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx1[i];             //此处rdx1粗心写成ldx1
rdy[i]=rdy1[i];


}
if (posi==2)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx2[i];
rdy[i]=rdy2[i];


}
if (posi==3)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx3[i];
rdy[i]=rdy3[i];


}
if (posi==4)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx4[i];
rdy[i]=rdy4[i];


}



for (i=1;i<=3;i++)            //  此处3粗心写成4 
{
if (  is_board(r+rdx[i],c+rdy[i]) && map1[r+rdx[i]][c+rdy[i]]=='.' ||map1[r+rdx[i]][c+rdy[i]]=='E' )
{
if (map1[r+rdx[i]][c+rdy[i]]=='E') {rsign=1;return 0;}


if   (rdx[i]==0  &&   rdy[i]==-1 ) posi=1;
if   (rdx[i]==-1 &&   rdy[i]== 0 ) posi=2;
if   (rdx[i]==0  &&   rdy[i]== 1 ) posi=3;
if   (rdx[i]==1  &&   rdy[i]== 0 ) posi=4;


// map1[r+rdx[i]][c+rdy[i]]='#';        //因为此处没屏蔽  一直tle!!!!!!!!!!!
rk++;


rdfs(r+rdx[i],c+rdy[i],posi);
if  (rsign==1) return 0;
// map1[r+rdx[i]][c+rdy[i]]='.';       //因为此处没屏蔽  一直tle!!!!!!!!!!!

rk++;


}
}





return 0;



int  countt(node  a)
{
if (a.x==startx&&a.y==starty)  {bk++;return 0;}
else 
{
countt(track[a.x][a.y]);
bk++;
}
return 0;
}








int bfs(int r, int c)
{
while ( !qq.empty() )
{
node tmp;

node son=qq.front();
int i;
for ( i=1;i<=4;i++)
{

if (  is_board(son.x+xx[i],son.y+yy[i]) && map2[son.x+xx[i]][son.y+yy[i]]=='.' ||map2[son.x+xx[i]][son.y+yy[i]]=='E')
{
tmp.x=son.x+xx[i];
tmp.y=son.y+yy[i];
track[tmp.x][tmp.y]=qq.front();
if (map2[son.x+xx[i]][son.y+yy[i]]=='E')  { ok=1;return 0;}

map2[son.x+xx[i]][son.y+yy[i]]='#'; 
qq.push(tmp); 

}
}

qq.pop();



}
return 0;



这题主要是题意太难读懂。。。。

0 0