程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU/HDOJ 2102 A計劃 廣度優先搜索BFS

HDU/HDOJ 2102 A計劃 廣度優先搜索BFS

編輯:C++入門知識

wa了很多次,很悲劇,傳送門有幾個需要注意的細節,看remap函數,對這些情況的處理。


[cpp] 
#include<iostream>  
#include<cstring>  
#include<algorithm>  
#include<cmath>  
#include<map>  
#include<cstdio>  
#include<queue>  
#include<fstream>  
using namespace std; 
int n,m,t,flag; 
int dir[4][2]={-1,0,1,0,0,1,0,-1}; 
char maze[2][11][11]; 
bool visit[2][11][11]; 
struct node{ 
    int x,y,h; 
    int step; 
}p,q,endp; 
queue<node> Q; 
bool isbond(node &a){ 
    if(a.x<0||a.x>=m||a.y<0||a.y>=n)return 1; 
    return 0; 

void bfs() 

    while(!Q.empty())Q.pop(); 
 
    p.x=p.y=p.h=p.step=0; 
    visit[0][0][0]=1; 
    Q.push(p); 
    while(!Q.empty()) 
    { 
        p=Q.front(); 
        Q.pop(); 
     
        if(maze[p.h][p.x][p.y]=='#'){ //傳送   
                if(!visit[!p.h][p.x][p.y]){ 
                    if(maze[!p.h][p.x][p.y]=='P'){ 
                        if(p.step<=t){ 
                            flag=1; 
                            return ; 
                        } 
                        return ; 
                    } 
                 visit[!p.h][p.x][p.y]=1; 
                 p.h=!p.h; 
                 Q.push(p);  
                } 
                 
               continue; 
            }    
        for(int i=0;i<4;i++) 
        { 
            q.x=p.x+dir[i][0]; 
            q.y=p.y+dir[i][1]; 
            q.h=p.h; 
            q.step=p.step+1; 
             
            if(isbond(q))continue;  // 邊界   
            if(maze[q.h][q.x][q.y]=='*')continue; //當前障礙   
            if(visit[q.h][q.x][q.y])continue; //訪問   
            if(maze[q.h][q.x][q.y]=='P'){ 
                if(q.step<=t){ 
                    flag=1; 
                    return ; 
                } 
                return ; 
            } 
            visit[q.h][q.x][q.y]=1; 
            Q.push(q); 
        } 
    } 

void remap() 

    for(int i=0;i<n;i++) 
    { 
        for(int j=0;j<m;j++) 
        { 
            if((maze[0][i][j]=='#'&&maze[1][i][j]=='#')||(maze[0][i][j]=='#'&&maze[1][i][j]=='*')||(maze[0][i][j]=='*'&&maze[1][i][j]=='#'))   
                maze[0][i][j]=maze[1][i][j]='*';   
        }   
    }   

int main() 

    int c; 
//  ifstream fin;  
//  fin.open("aaa.txt");  
     
    cin>>c; 
    while(c--) 
    { 
        cin>>n>>m>>t; 
        for(int i=0;i<n;i++) 
            for(int j=0;j<m;j++){ 
                cin>>maze[0][i][j]; 
            }            
        for(int i=0;i<n;i++) 
            for(int j=0;j<m;j++){ 
                cin>>maze[1][i][j]; 
            } 
        flag=0; 
        memset(visit,0,sizeof(visit)); 
        remap(); 
        bfs(); 
        if(flag)cout<<"YES"<<endl; 
        else cout<<"NO"<<endl;           
         
    } 
    return 0; 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstdio>
#include<queue>
#include<fstream>
using namespace std;
int n,m,t,flag;
int dir[4][2]={-1,0,1,0,0,1,0,-1};
char maze[2][11][11];
bool visit[2][11][11];
struct node{
 int x,y,h;
 int step;
}p,q,endp;
queue<node> Q;
bool isbond(node &a){
 if(a.x<0||a.x>=m||a.y<0||a.y>=n)return 1;
 return 0;
}
void bfs()
{
 while(!Q.empty())Q.pop();

 p.x=p.y=p.h=p.step=0;
 visit[0][0][0]=1;
 Q.push(p);
 while(!Q.empty())
 {
  p=Q.front();
  Q.pop();
 
  if(maze[p.h][p.x][p.y]=='#'){ //傳送
    if(!visit[!p.h][p.x][p.y]){
     if(maze[!p.h][p.x][p.y]=='P'){
      if(p.step<=t){
       flag=1;
       return ;
      }
      return ;
     }
     visit[!p.h][p.x][p.y]=1;
     p.h=!p.h;
     Q.push(p); 
    }
    
      continue;
   }  
  for(int i=0;i<4;i++)
  {
   q.x=p.x+dir[i][0];
   q.y=p.y+dir[i][1];
   q.h=p.h;
   q.step=p.step+1;
   
   if(isbond(q))continue;  // 邊界
   if(maze[q.h][q.x][q.y]=='*')continue; //當前障礙
   if(visit[q.h][q.x][q.y])continue; //訪問
   if(maze[q.h][q.x][q.y]=='P'){
    if(q.step<=t){
     flag=1;
     return ;
    }
    return ;
   }
   visit[q.h][q.x][q.y]=1;
   Q.push(q);
  }
 }
}
void remap()
{
 for(int i=0;i<n;i++)
 {
  for(int j=0;j<m;j++)
  {
   if((maze[0][i][j]=='#'&&maze[1][i][j]=='#')||(maze[0][i][j]=='#'&&maze[1][i][j]=='*')||(maze[0][i][j]=='*'&&maze[1][i][j]=='#')) 
    maze[0][i][j]=maze[1][i][j]='*'; 
  } 
 } 
}
int main()
{
 int c;
// ifstream fin;
// fin.open("aaa.txt");
 
 cin>>c;
 while(c--)
 {
  cin>>n>>m>>t;
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++){
    cin>>maze[0][i][j];
   }   
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++){
    cin>>maze[1][i][j];
   }
  flag=0;
  memset(visit,0,sizeof(visit));
  remap();
  bfs();
  if(flag)cout<<"YES"<<endl;
  else cout<<"NO"<<endl;   
  
 }
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved