HDU 1240 Asteroids!
        
        简单BFS  MS数据太弱
    

 Code
CodeProblem : 1240 ( Asteroids! ) Judge Status : Accepted
RunId : 1634142 Language : C++ Author : LongZhiRi
Code Render Status : Rendered By HDOJ C++ Code Rander Version 0.01 Beta
#include <iostream>
#include <queue>
#include <string>
using namespace std;
char Map[11][11][11];
bool bVisited[11][11][11];
int Move[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };
int N;
struct Pos
{
int x,y,z;
int step_num;
Pos(int a =0,int b=0, int c=0,int sn = 0):x(a),y(b),z(c),step_num(sn) {}
friend bool operator== (const Pos & p1,const Pos & p2)
{
return (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z);
}
};
inline bool InBoundary(Pos p)
{
return ((p.x>=0 && p.x<N)&&(p.y>=0 && p.y<N)&&(p.z>=0 && p.z<N));
}
bool BFS(Pos start,Pos end,int & sum)
{
sum = 0;
if(start == end)
{
sum = 0;
return true;
}
queue<Pos> Q;
Q.push(start);
bVisited[start.x][start.y][start.z] = true;
while(!Q.empty())
{
Pos t = Q.front();
Q.pop();
for(int i = 0; i < 6; i++)
{
Pos next(t.x + Move[i][0],t.y + Move[i][1],t.z + Move[i][2],t.step_num+1);
if(!InBoundary(next) || Map[next.x][next.y][next.z] == 'X' || bVisited[next.x][next.y][next.z])
continue;
if(next == end)
{
sum = next.step_num;
return true;
}
Q.push(next);
bVisited[next.x][next.y][next.z] = true;
}
}
return false;
}
int main()
{
string nouse;
while(cin >> nouse)
{
cin >> N;
int i,j,k;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
for(k = 0; k < N; k++)
{
cin >> Map[i][j][k];
bVisited[i][j][k] = false;
}
}
}
Pos start,end;
cin >> start.z >> start.y >> start.x;
cin >> end.z >> end.y >> end.x;
int sum;
cin >> nouse;
if(BFS(start,end,sum))
{
cout << N << " " << sum <<endl;
}
else
cout << "NO ROUTE" <<endl;
}
return 0;
}
#include <iostream>
#include <queue>
#include <string>
using namespace std;
char Map[11][11][11];
bool bVisited[11][11][11];
int Move[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };
int N;
struct Pos
{
int x,y,z;
int step_num;
Pos(int a =0,int b=0, int c=0,int sn = 0):x(a),y(b),z(c),step_num(sn) {}
friend bool operator== (const Pos & p1,const Pos & p2)
{
return (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z);
}
};
inline bool InBoundary(Pos p)
{
return ((p.x>=0 && p.x<N)&&(p.y>=0 && p.y<N)&&(p.z>=0 && p.z<N));
}
bool BFS(Pos start,Pos end,int & sum)
{
sum = 0;
if(start == end)
{
sum = 0;
return true;
}
queue<Pos> Q;
Q.push(start);
bVisited[start.x][start.y][start.z] = true;
while(!Q.empty())
{
Pos t = Q.front();
Q.pop();
for(int i = 0; i < 6; i++)
{
Pos next(t.x + Move[i][0],t.y + Move[i][1],t.z + Move[i][2],t.step_num+1);
if(!InBoundary(next) || Map[next.x][next.y][next.z] == 'X' || bVisited[next.x][next.y][next.z])
continue;
if(next == end)
{
sum = next.step_num;
return true;
}
Q.push(next);
bVisited[next.x][next.y][next.z] = true;
}
}
return false;
}
int main()
{
string nouse;
while(cin >> nouse)
{
cin >> N;
int i,j,k;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
for(k = 0; k < N; k++)
{
cin >> Map[i][j][k];
bVisited[i][j][k] = false;
}
}
}
Pos start,end;
cin >> start.z >> start.y >> start.x;
cin >> end.z >> end.y >> end.x;
int sum;
cin >> nouse;
if(BFS(start,end,sum))
{
cout << N << " " << sum <<endl;
}
else
cout << "NO ROUTE" <<endl;
}
return 0;
}
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号