Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

比较简单的bfs...一次ac

Posted by suicid at 2010-06-24 12:56:44 on Problem 3322 and last updated at 2010-06-24 12:58:01
struct里存box的左上角坐标、方向、时间
hash可以利用位运算来做

#include"iostream"
#include"cstdlib"
#include"queue"
#include"cstdio"
#include"string.h"
using namespace std;
int R,C;
char map[501][501];
short used[501][501];
struct node{
   int d,x,y,t;
   node(int d,int x,int y,int t):d(d),x(x),y(y),t(t){}
};
int data[4]={1,2,4,8};
queue<node>q;
int bfs(int sx,int sy,int sd){
   int x,y,d,ti;
   while(!q.empty())q.pop();
   memset(used,0,sizeof(used));
   node t(sd,sx,sy,0);
   q.push(t);
   used[sx][sy]=data[sd];
   while(!q.empty()){
      t=q.front();
      q.pop();
      x=t.x;
      y=t.y;
      d=t.d;
      ti=t.t;
      if(d==0){
         if(map[x-1][y]!='#' && map[x-2][y]!='#'){
            if((used[x-2][y]&4)==0){
               used[x-2][y]|=4;
               q.push(node(2,x-2,y,ti+1));
            }
         }
         if(map[x+1][y]!='#' && map[x+2][y]!='#'){
            if((used[x+1][y]&4)==0){
               used[x+1][y]|=4;
               q.push(node(2,x+1,y,ti+1));
            }
         }
         if(map[x][y-1]!='#' && map[x][y-2]!='#'){
            if((used[x][y-2]&2)==0){
               used[x][y-2]|=2;
               q.push(node(1,x,y-2,ti+1));
            }
         }
         if(map[x][y+1]!='#' && map[x][y+2]!='#'){
            if((used[x][y+1]&2)==0){
               used[x][y+1]|=2;
               q.push(node(1,x,y+1,ti+1));
            }
         }
      }
      else if(d==1){
         if(map[x-1][y]!='#' && map[x-1][y+1]!='#'){
            if((used[x-1][y]&2)==0){
               used[x-1][y]|=2;
               q.push(node(1,x-1,y,ti+1));
            }
         }
         if(map[x+1][y]!='#' && map[x+1][y+1]!='#'){
            if((used[x+1][y]&2)==0){
               used[x+1][y]|=2;
               q.push(node(1,x+1,y,ti+1));
            }
         }
         if(map[x][y-1]!='#' && map[x][y-1]!='E'){
            if(map[x][y-1]=='O')return ti+1;
            if((used[x][y-1]&1)==0){
               used[x][y-1]|=1;
               q.push(node(0,x,y-1,ti+1));
            }
         }
         if(map[x][y+2]!='#' && map[x][y+2]!='E'){
            if(map[x][y+2]=='O')return ti+1;
            if((used[x][y+2]&1)==0){
               used[x][y+2]|=1;
               q.push(node(0,x,y+2,ti+1));
            }
         }
      }
      else if(d==2){
         if(map[x-1][y]!='#' && map[x-1][y]!='E'){
            if(map[x-1][y]=='O')return ti+1;
            if((used[x-1][y]&1)==0){
               used[x-1][y]|=1;
               q.push(node(0,x-1,y,ti+1));
            }
         }
         if(map[x+2][y]!='#' && map[x+2][y]!='E'){
            if(map[x+2][y]=='O')return ti+1;
            if((used[x+2][y]&1)==0){
               used[x+2][y]|=1;
               q.push(node(0,x+2,y,ti+1));
            }
         }
         if(map[x][y-1]!='#' && map[x+1][y-1]!='#'){
            if((used[x][y-1]&4)==0){
               used[x][y-1]|=4;
               q.push(node(2,x,y-1,ti+1));
            }
         }
         if(map[x][y+1]!='#' && map[x+1][y+1]!='#'){
            if((used[x][y+1]&4)==0){
               used[x][y+1]|=4;
               q.push(node(2,x,y+1,ti+1));
            }
         }
      }
   }
   return -1;
}
int main(){
    int x0,y0,d0,res;
    bool flag;
    while(scanf("%d%d",&R,&C)&&R){
       for(int i=0;i<R;i++){
          scanf(" %s",map[i]);
       }
       flag=false;
       for(int i=1;i<R-1;i++){
          for(int j=1;j<C-1;j++){
             if(map[i][j]=='X'){
                x0=i;
                y0=j;
                if(map[i][j+1]=='X')d0=1;
                else if(map[i+1][j]=='X')d0=2;
                else d0=0;
                flag=true;
                break;
             }
          }
          if(flag)break;
       }
       res=bfs(x0,y0,d0);
       if(res==-1)printf("Impossible\n");
       else printf("%d\n",res);
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator