现在的位置: 首页 > 综合 > 正文

A计划

2012年12月11日 ⁄ 综合 ⁄ 共 1441字 ⁄ 字号 评论关闭

这个题目是关于BFS的一个应用,这题主要是两张地图,要逾越地图必须寻找“#‘,而且要判断对应的位置是否为’#‘或'*',坐标最好用三维数组,分别赋值就行了(因为只有2张)

对于位置的转移很方便。其他的就没什么大问题了.

#include<stdio.h>
#include<string.h>


struct node{
int x,y,z,t;
}a[10000];


const int x_add[]={0,0,1,-1};
const int y_add[]={1,-1,0,0};
char map[2][1000][11];
int visit[2][1000][11];
int N,M,T,flag;
 
int judg(int x,int y)
{
  return(x>=0&&x<N&&y>=0&&y<M);
}
void BFS(int x,int y,int z)
{   
memset(visit,0,sizeof(visit));
int rear=0,front=0;
a[rear].x=x;
a[rear].y=y;
a[rear].z=z;
a[rear++].t=0;
while(rear>front)
{
int x=a[front].x,y=a[front].y,z=a[front++].z;
     for(int i=0;i<4;i++)
     {
     int xx=x+x_add[i],yy=y+y_add[i],zz=z;
     if(map[zz][xx][yy]=='#')
      { 
        visit[zz][xx][yy]=1; 
        if(zz==0&&map[zz+1][xx][yy]!='#'&&map[zz+1][xx][yy]!='*')
            zz++;
        if(zz==1&&map[zz-1][xx][yy]!='#'&&map[zz-1][xx][yy]!='*')
            zz--;          
      }                                                 
     if(judg(xx,yy)&&(map[zz][xx][yy]=='.'||map[zz][xx][yy]=='P')&&visit[zz][xx][yy]==0)
         {   
           visit[zz][xx][yy]=1;
           a[rear].x=xx;
           a[rear].y=yy;
           a[rear].z=zz;
           a[rear].t=a[front-1].t+1;
           if(map[zz][xx][yy]=='P')
          { 
             if(a[rear].t<=T) 
                flag=1;             
             return;
          } 
          rear++;    
         }
       }
     }
}
       
 int main()
 {    int x1,y1,z1,n;
     scanf("%d",&n);
     while(n--)
     {  flag=0;
     scanf("%d%d%d",&N,&M,&T);
     if(N>=1&&M<=10)
     { 
      for(int i=0;i<N;i++)
        scanf("%s",&map[0][i]); 
          
       for(int i=0;i<N;i++)
        scanf("%s",&map[1][i]);
        
       for(int i=0;i<2;i++)
         for(int j=0;j<N;j++)
           for(int k=0;k<M;k++)
           {
           if(map[i][j][k]=='S')
             { 
              z1=i,x1=j,y1=k;
               goto loop;
              }
           }
    loop: BFS(x1,y1,z1);
       if(flag==1)
       printf("YES\n");
       else
       printf("NO\n");
     }
     }
     return 0;
 }
 /*
3
4 4 7
.*.P
...*
.*..
#...


..#.
..*.
#.S.
...*


5 5 15
S..#.
.**..
.#...
..#.*
*...#


...*.
.#...
*...#
P*...
...*.
*/
     

     

抱歉!评论已关闭.