hdu 2216 Game III

网上查了标记路径的方法之后就是一道普通的搜索题了,自己还是想不到关键的,努力!

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
struct node
{
    int zx,zy,sx,sy,s;
} t,t0;
char g[25][25];
int m,n,vis[25][25][25][25];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int fx[]={0,0,-1,1};
int fy[]={-1,1,0,0};
queue<node>q;

int check(int z1,int z2,int s1,int s2)
{
    int i;
    if(z1==s1&&z2==s2)
        return 1;

    for(i=0;i<4;i++)
        if(z1+dx[i]==s1&&z2+dy[i]==s2)
            return 1;

    return 0;
}

int bfs(int z1,int z2,int s1,int s2)
{
    int i,flag=-1;
    if(check(z1,z2,s1,s2)==0)
    {
        t.zx=z1;
        t.zy=z2;
        t.sx=s1;
        t.sy=s2;
        t.s=0;
        g[z1][z2]='.';
        g[s1][s2]='.';
        vis[z1][z2][s1][s2]=1;
        while(!q.empty()) q.pop();
        q.push(t);
        while(!q.empty())
        {
            t0=q.front();
            q.pop();
            if(check(t0.zx,t0.zy,t0.sx,t0.sy))
            {
                flag=t0.s;
                break;
            }

           for(i=0;i<4;i++)
           {
               t.zx=t0.zx+dx[i];
               t.zy=t0.zy+dy[i];
               t.sx=t0.sx+fx[i];
               t.sy=t0.sy+fy[i];
               t.s=t0.s+1;
               if(t.zx<0||t.zx>n||t.zy<0||t.zy>m||g[t.zx][t.zy]!='.') continue;
               else
               {
                   if(t.sx<0||t.sx>n||t.sy<0||t.sy>m||g[t.sx][t.sy]!='.')
                   {
                       t.sx=t0.sx;
                       t.sy=t0.sy;
                   }
                   if(!vis[t.zx][t.zy][t.sx][t.sy])
                   {
                       vis[t.zx][t.zy][t.sx][t.sy]=1;
                       q.push(t);
                   }
               }
           }
        }
    }
    else flag=0;
    return flag;
}

int main()
{
    int i,j,z1,z2,s1,s2;
    while(~scanf("%d%d",&n,&m))
    {
        memset(vis,0,sizeof(vis));

        for(i=0; i<n; i++)
            scanf("%s",g[i]);

        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
                if(g[i][j]=='Z')
                {
                    z1=i;
                    z2=j;
                }
                else if(g[i][j]=='S')
                {
                    s1=i;
                    s2=j;
                }

        int k=bfs(z1,z2,s1,s2);

        if(k==-1)
            printf("Bad Luck!\n");
        else
            printf("%d\n",k);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

posted @ 2015-05-17 21:19  xryz  阅读(95)  评论(0编辑  收藏  举报