首页 > 代码库 > poj3083 Children of the Candy Corn

poj3083 Children of the Candy Corn

这道题有深搜和广搜。深搜还有要求,靠左或靠右。下面以靠左为例,可以把简单分为上北,下南,左西,右东四个方向。向东就是横坐标i不变,纵坐标j加1(i与j其实就是下标)。其他方向也可以这样确定。通过上一步方向可以确定下一步应该从哪个方向开始搜。比如说,是向北走的,就必须先搜西,西不可以走,再搜北,如果北还不可以走,再搜东,最后才是南。其他方向的情况也可以这样推出来。最后走到E点完成了。广搜就是最基础的广搜。这道题做了将近10个小时。中途曾几次准备放弃,但最后还是坚持做完了。

#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<algorithm>using namespace std;char maze[40][40];int n,m,ex,ey,sx,sy,flag,s,cx,cy,df;int dlx[7]={0,1,0,-1,0,1,0};int dly[7]={1,0,-1,0,1,0,-1};int drx[7]={0,-1,0,1,0,-1,0};int dry[7]={1,0,-1,0,1,0,-1};int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int isin(int x,int y){    return x>=0&&x<n&&y>=0&&y<m;}void lfs(int i,int j){    int x,y,k;    if(flag) return ;    if(i==ex&&j==ey) {flag=1;}    else    for(k=df;k<7&&!flag;k++)    {        cx=dlx[k];        cy=dly[k];        x=i+dlx[k];        y=j+dly[k];        if(isin(x,y)&&maze[x][y]!=‘#‘){            s++;             if(cx==1) df=0;            //往南的,先搜东            else if(cx==-1) df=2;            //往北的,先搜西            else if(!cx){            if(cy==1) df=3;            //往东的,先搜北            else df=1;        }            //printf("(%d %d) ",x,y);            lfs(x,y);        }    }}void rfs(int i,int j){    int x,y,k,d;    if(flag) return ;    if(i==ex&&j==ey) {flag=1;}    else    for(k=df;k<7&&!flag;k++)    {        cx=drx[k];        cy=dry[k];        x=i+drx[k];        y=j+dry[k];        if(isin(x,y)&&maze[x][y]!=‘#‘){            s++;             if(cx==1) df=2;            //往南的,先搜西            else if(cx==-1) df=0;            //往北的,先搜东            else if(!cx){            if(cy==1) df=3;            //往东的,先搜南            else df=1;        }            //printf("(%d %d) ",x,y);            rfs(x,y);        }    }}struct node{    int dis,row,col;};queue<node> q;void  bfs(){    int x,y,k,d,i,j;    node t;    while(!q.empty())    {        t=q.front();        q.pop();        d=t.dis;        i=t.row;        j=t.col;        for(k=0;k<4;k++)        {            x=i+dx[k];            y=j+dy[k];            if(maze[x][y]!=‘#‘&&isin(x,y)){                if(x==ex&&y==ey){                    s=d+1;                    return ;                }                else{                    t.dis=d+1;                    t.row=x;                    t.col=y;                    q.push(t);                    maze[x][y]=‘#‘;                }            }        }    }}int main(){    int ca,i,j;    scanf("%d",&ca);    while(ca--)    {        scanf("%d%d",&m,&n);        getchar();        for(i=0;i<n;i++) gets(maze[i]);        for(i=0;i<n;i++){            for(j=0;j<m;j++){                if(maze[i][j]==‘S‘){                    sx=i;sy=j;                    maze[sx][sy]=‘#‘;                }                else if(maze[i][j]==‘E‘){                    ex=i;ey=j;                    maze[ex][ey]=‘.‘;                }            }        }        flag=0;        s=1;        if(!sy) df=3;        else if(!sx) df=0;        else if(sy==m-1) df=1;        else if(sx==n-1) df=2;        lfs(sx,sy);        if(!sy) df=3;        else if(!sx) df=0;        else if(sy==m-1) df=1;        else if(sx==n-1) df=2;        cout<<s<<‘ ‘;        flag=0;        s=1;        rfs(sx,sy);        cout<<s<<‘ ‘;        while(!q.empty()) q.pop();        node p;        p.dis=1;        p.row=sx;        p.col=sy;        q.push(p);        s=1;        bfs();        cout<<s<<endl;    }    return 0;}

  

poj3083 Children of the Candy Corn