| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:今天又改了一下这道题,改成0ms了In Reply To:做了1个多小时,1A啊啊,刚开始学搜索,拙代码供大家看看 Posted by:TSERROF at 2012-09-29 15:36:36 #include <iostream>
#include <cstring>
#include <queue>
using namespace std;
char map[45][45];
int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
bool lDFS(int i,int j,int orient,int step)
{
if(map[i][j]=='E'){ cout<<step+1<<" ";return true;}
if(orient<0)orient+=4;
for(int k=orient;k<orient+4;++k)
{
int di=i+dir[k%4][0];
int dj=j+dir[k%4][1];
if(map[di][dj]!='#') if(lDFS(di,dj,(k-1)%4,step+1))return true;
}
return false;
}
bool rDFS(int i,int j,int orient,int step)
{
if(map[i][j]=='E')
{
cout<<step+1<<" ";
return true;
}
for(int k=orient+4;k>orient;--k)
{
int di=i+dir[k%4][0];
int dj=j+dir[k%4][1];
if(map[di][dj]!='#')if(rDFS(di,dj,(k+1)%4,step+1))return true;
}
return 0;
}
struct C
{
int x,y,step;
};
int BFS(int i,int j)
{
queue<C>c;
C tempc;
tempc.x=i,tempc.y=j,tempc.step=1;
c.push(tempc);
while(!c.empty())
{
tempc=c.front();
c.pop();
if(map[tempc.x][tempc.y]=='E')return tempc.step;
map[tempc.x][tempc.y]='#';
for(int i=0;i<4;++i)
{
C t;
t.x=tempc.x+dir[i][0],t.y=tempc.y+dir[i][1],t.step=tempc.step+1;
if(map[t.x][t.y]!='#')
{
c.push(t);
if(map[t.x][t.y]!='E')map[t.x][t.y]='#';
}
}
}
return -1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int row,col,sj,si;
cin>>col>>row;
memset(map,'#',sizeof(map));
for(int i=1;i<=row;++i)
for(int j=1;j<=col;++j)
{
cin>>map[i][j];
if(map[i][j]=='S')si=i,sj=j;
}
lDFS(si,sj,0,0);
rDFS(si,sj,0,0);
cout<<BFS(si,sj)<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator