poj 2935 Basic Wall Maze

是一个图论的基础搜索题~

没什么好说的就是搜索就好 主要是别把 代码写的太屎,错了不好找

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int sx,sy,ex,ey;
struct info
{
    int x,y;
    char ko;
    int qian;
};
info que[40];
bool flag[10][10];
int n,m;
bool vi[10][10][4];
int d[4][2]={-1,0,1,0,  0,-1,  0,  1};
char dd[5]={"WENS"};
void print(int p)
{
    if(p!=0) print(que[p].qian);
    if(p!=0)printf("%c",que[p].ko);
}
bool jude(int x,int y)
{
    return x>=1&&y>=1&&x<=6&&y<=6&&flag[x][y]==0;
}
void solve()
{
    int h=0,r=1;
    int x,y,x0,y0;
    que[0].x=sx,que[0].y=sy;
    flag[sx][sy]=1;
    while(h!=r)
    {
        x=que[h].x;
        y=que[h].y;
        h++;
        for(int i=0;i<4;i++)
        {
            if(vi[x][y][i])
            {
                x0=x+d[i][0];
                y0=y+d[i][1];
                if(jude(x0,y0))
                {
                    flag[x0][y0]=1;
                    que[r].x=x0;
                    que[r].y=y0;
                    que[r].qian=h-1;
                    que[r].ko=dd[i];
                    if(x0==ex&&y0==ey) {print(r);return ;}
                    r++;
                }
            }
        }
    }
}
int main()
{
    int a,b,c,d;
    while(~scanf("%d%d",&sx,&sy))
    {
        if(sx==0&&sy==0) break;
        memset(vi,1,sizeof(vi));
        memset(flag,0,sizeof(flag));
        scanf("%d%d",&ex,&ey);
        for(int i=0;i<3;i++)
        {
            scanf("%d%d%d%d",&a,&b,&c,&d);
            if(a==c)
            {
                for(int i=min(b,d)+1;i<=max(b,d);i++)
                    vi[a][i][1]=0,vi[a+1][i][0]=0;
            }
            else if(b==d)
            {
                for(int i=min(a,c)+1;i<=max(a,c);i++)
                    vi[i][b][3]=0,vi[i][b+1][2]=0;
            }
        }
        solve();printf("
");
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/shuly/p/3459927.html