hdu 4478 Where is the King (BFS)

题目分析:给一个n*n的矩阵,.表明可以走,#表明不可以走,给起始位置(x,y),king可以走8个方向,求在t s时,king可能在多少个位置上

注意:1.如果king在第ts到达某个位置 那么在t+2s 肯定还可以到达这个位置,那么对于每个位置可能到达的位置,可能有个到达此位置时的最小偶数even时间,可能有个到达此位置时最小奇数odd时间,所以对于每一个位置,设置两个变量记录这两个值,之后,再扫描一遍,如果t是奇数,t>=odd,ans++;如果t是偶数,t>=even,ans++;

        2.由于t<=10^9,很大 不知道如何结束搜索,一直没有想到结束bfs一个节点的方法,参考了这位神的代码码http://blog.csdn.net/binwin20/article/details/8248768,才明白,当一个节点even或者odd被搜到两次,就可以结束了,,,如果他是第一次被搜索到,那么吧这个节点加入队列中去

代码:

#include<iostream>
#include<cstdio>
#include<memory.h>
#include<queue>
using namespace std;
int maze[110][110];
struct node1
{
    int even;
    int odd;
}vis[110][110];
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct node
{
    int x,y;
    int t;
};
int n;
queue<node>q;
bool IN(int x,int y)
{
    if(1<=x&&x<=n  &&  1<=y&&y<=n)
        return true;
    else
        return false;
}
int main()
{
    int C,t,x,y;
    scanf("%d",&C);
    while(C--)
    {
        scanf("%d %d %d %d",&n,&t,&x,&y);
        memset(maze,0,sizeof(maze));
        memset(vis,-1,sizeof(vis));
        char ch;
        getchar();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%c",&ch);
                if(ch=='.')
                    maze[i][j]=1;
            }
            getchar();
        }
        int ans=0,x1,y1;
        node a;
        a.x=x;
        a.y=y;
        a.t=0;
        vis[x][y].even=0;/***忘了这个,WA了一次*/
        while(!q.empty())/***清空队列****/
            q.pop();
        q.push(a);
        while(!q.empty())
        {
            node a1=q.front();
            q.pop();
            node a2;
            //printf("x=%d y=%d\n",a1.x,a1.y);
            for(int i=0;i<8;i++)
            {
                a2.x=a1.x+dir[i][0];
                a2.y=a1.y+dir[i][1];
                if(IN(a2.x,a2.y) && maze[a2.x][a2.y]==1)
                {
                    a2.t=a1.t+1;
                    if(a2.t%2==0)
                    {
                        if(vis[a2.x][a2.y].even==-1)
                        {
                            vis[a2.x][a2.y].even=a2.t;
                            q.push(a2);
                        }
                        else
                            continue;
                    }
                    else if(a2.t%2==1)
                    {
                        if(vis[a2.x][a2.y].odd==-1)
                        {
                            vis[a2.x][a2.y].odd=a2.t;
                            q.push(a2);
                        }
                        else
                            continue;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
           {
              if(t%2==0)
              {
                  if(vis[i][j].even!=-1&&vis[i][j].even<=t)
                     ans++;
              }
              else
              {
                  if(vis[i][j].odd!=-1&&vis[i][j].odd<=t)
                    ans++;
              }
           }
        if(ans==0)
            ans++;
        printf("%d\n",ans);
    }
    return 0;
}



/******************错误代码
#include<iostream>
#include<cstdio>
#include<memory.h>
#include<queue>
using namespace std;
int maze[110][110];
int vis[110][110];
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct node
{
    int x,y;
    int t;
};
int n;
queue<node>q;
bool IN(int x,int y)
{
    if(1<=x&&x<=n  &&  1<=y&&y<=n)
        return true;
    else
        return false;
}
int main()
{
    int C,t,x,y;
    scanf("%d",&C);
    while(C--)
    {
        scanf("%d %d %d %d",&n,&t,&x,&y);
        memset(maze,0,sizeof(maze));
        memset(vis,0,sizeof(vis));
        char ch;
        getchar();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%c",&ch);
                if(ch=='.')
                    maze[i][j]=1;
            }
            getchar();
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                printf("%d ",maze[i][j]);
            printf("\n");
        }
        int ans=0,x1,y1;
        node a;
        a.x=x;
        a.y=y;
        a.t=0;
        while(!q.empty())//清空队列
            q.pop();

        q.push(a);
        while(!q.empty())
        {
            node a1=q.front();
            q.pop();
            node a2;
            //printf("x=%d y=%d\n",a1.x,a1.y);
            for(int i=0;i<8;i++)
            {
                a2.x=a1.x+dir[i][0];
                a2.y=a1.y+dir[i][1];
                //printf("a2.x=%d a2.y=%d\n",a2.x,a2.y);
                if(IN(a2.x,a2.y) && maze[a2.x][a2.y]==1)
                {
                    //printf("a2.x=%d a2.y=%d\n",a2.x,a2.y);
                    a2.t=a1.t+1;//a2.t++;
                    if(a2.t==t)//注意判重
                    {
                        if(vis[a2.x][a2.y]==0)//判重
                        {
                            ans++;
                            vis[a2.x][a2.y]=1;
                        }
                        continue;
                    }
                    else
                       q.push(a2);
                }
            }
        }
        if(ans==0)
            ans++;
        printf("%d\n",ans);
    }
    return 0;
}
*/


/***************************************
#include<iostream>
#include<cstdio>
#include<memory.h>
#include<queue>
using namespace std;
int maze[110][110];
int vis[110][110];
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct node
{
    int x,y;
    int t;
};
int n;
queue<node>q;
bool IN(int x,int y)
{
    if(1<=x&&x<=n  &&  1<=y&&y<=n)
        return true;
    else
        return false;
}
int main()
{
    int C,t,x,y;
    scanf("%d",&C);
    while(C--)
    {
        scanf("%d %d %d %d",&n,&t,&x,&y);
        memset(maze,0,sizeof(maze));
        memset(vis,0,sizeof(vis));
        char ch;
        getchar();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%c",&ch);
                if(ch=='.')
                    maze[i][j]=1;
            }
            getchar();
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                printf("%d ",maze[i][j]);
            printf("\n");
        }
        int ans=0,x1,y1;
        node a;
        a.x=x;
        a.y=y;
        a.t=0;
        while(!q.empty())//清空队列
            q.pop();

        q.push(a);
        while(!q.empty())
        {
            node a1=q.front();
            q.pop();
            node a2;
            printf("x=%d y=%d\n",a1.x,a1.y);
            for(int i=0;i<8;i++)
            {
                a2.x=a1.x+dir[i][0];
                a2.y=a1.y+dir[i][1];
                printf("a2.x=%d a2.y=%d\n",a2.x,a2.y);
                if(IN(a2.x,a2.y) && maze[a2.x][a2.y]==1 && vis[a2.x][a2.y]==0)
                {
                    vis[a2.x][a2.y]=1;
                    ans++;
                    a2.t++;
                    if(a2.t>=t)
                        continue;
                    q.push(a2);
                }
            }
        }
         if(ans==0)
            ans++;
        printf("%d\n",ans);
    }
    return 0;
}
*/


你可能感兴趣的:(hdu 4478 Where is the King (BFS))