#include<stdio.h>
#include<string.h>
char map[45][45];
int mark[45][45];
int visit[45][45];
int towards;//0向上,1向左,2向下,3向右
int left,right;
struct po
{
int x,y,id;
}ed,queue[2000],st,item;
void dfsl(int x,int y,int to)
{
left++;
if(x==ed.x&&y==ed.y)
{
return ;
}
if(to==0)
{
if(mark[x][y-1]==0)
{
dfsl(x,y-1,1);
}
else if(mark[x-1][y]==0)
{
dfsl(x-1,y,0);
}
else if(mark[x][y+1]==0)
{
dfsl(x,y+1,3);
}
else if(mark[x+1][y]==0)
{
dfsl(x+1,y,2);
}
}
else if(to==1)
{
if(mark[x+1][y]==0)
{
dfsl(x+1,y,2);
}
else if(mark[x][y-1]==0)
{
dfsl(x,y-1,1);
}
else if(mark[x-1][y]==0)
{
dfsl(x-1,y,0);
}
else if(mark[x][y+1]==0)
{
dfsl(x,y+1,3);
}
}
else if(to==2)
{
if(mark[x][y+1]==0)
{
dfsl(x,y+1,3);
}
else if(mark[x+1][y]==0)
{
dfsl(x+1,y,2);
}
else if(mark[x][y-1]==0)
{
dfsl(x,y-1,1);
}
else if(mark[x-1][y]==0)
{
dfsl(x-1,y,0);
}
}
else if(to==3)
{
if(mark[x-1][y]==0)
{
dfsl(x-1,y,0);
}
else if(mark[x][y+1]==0)
{
dfsl(x,y+1,3);
}
else if(mark[x+1][y]==0)
{
dfsl(x+1,y,2);
}
else if(mark[x][y-1]==0)
{
dfsl(x,y-1,1);
}
}
}
void dfsr(int x,int y,int to)
{
right++;
if(x==ed.x&&y==ed.y)
{
return ;
}
if(to==0)
{
if(mark[x][y+1]==0)
{
dfsr(x,y+1,3);
}
else if(mark[x-1][y]==0)
{
dfsr(x-1,y,0);
}
else if(mark[x][y-1]==0)
{
dfsr(x,y-1,1);
}
else if(mark[x+1][y]==0)
{
dfsr(x+1,y,2);
}
}
else if(to==1)
{
if(mark[x-1][y]==0)
{
dfsr(x-1,y,0);
}
else if(mark[x][y-1]==0)
{
dfsr(x,y-1,1);
}
else if(mark[x+1][y]==0)
{
dfsr(x+1,y,2);
}
else if(mark[x][y+1]==0)
{
dfsr(x,y+1,3);
}
}
else if(to==2)
{
if(mark[x][y-1]==0)
{
dfsr(x,y-1,1);
}
else if(mark[x+1][y]==0)
{
dfsr(x+1,y,2);
}
else if(mark[x][y+1]==0)
{
dfsr(x,y+1,3);
}
else if(mark[x-1][y]==0)
{
dfsr(x-1,y,0);
}
}
else if(to==3)
{
if(mark[x+1][y]==0)
{
dfsr(x+1,y,2);
}
else if(mark[x][y+1]==0)
{
dfsr(x,y+1,3);
}
else if(mark[x-1][y]==0)
{
dfsr(x-1,y,0);
}
else if(mark[x][y-1]==0)
{
dfsr(x,y-1,1);
}
}
}
void bfs(int m,int n)
{
memset(visit,0,sizeof(visit));
int fro,end;
fro=end=0;
queue[fro].x=m;
queue[end].y=n;
queue[end].id=1;
end++;
while(fro<end)
{
item=queue[fro];
fro++;
if(item.x==ed.x&&item.y==ed.y)
{
printf("%d\n",item.id);
}
if(mark[item.x][item.y-1]==0&&visit[item.x][item.y-1]==0)
{
visit[item.x][item.y-1]=1;
queue[end].x=item.x;
queue[end].y=item.y-1;
queue[end].id=item.id+1;
end++;
}
if(mark[item.x-1][item.y]==0&&visit[item.x-1][item.y]==0)
{
visit[item.x-1][item.y]=1;
queue[end].x=item.x-1;
queue[end].y=item.y;
queue[end].id=item.id+1;
end++;
}
if(mark[item.x][item.y+1]==0&&visit[item.x][item.y+1]==0)
{
visit[item.x][item.y+1]=1;
queue[end].x=item.x;
queue[end].y=item.y+1;
queue[end].id=item.id+1;
end++;
}
if(mark[item.x+1][item.y]==0&&visit[item.x+1][item.y]==0)
{
visit[item.x+1][item.y]=1;
queue[end].x=item.x+1;
queue[end].y=item.y;
queue[end].id=item.id+1;
end++;
}
}
return ;
}
int main()
{
int n/*行*/,m/*列*/,t;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
left=1;
right=1;
memset(mark,-1,sizeof(mark));
scanf("%d %d",&m,&n);
for(int j=1;j<=n;j++)
{
getchar();
for(int k=1;k<=m;k++)
{
scanf("%c",&map[j][k]);
if(map[j][k]=='.')
{
mark[j][k]=0;
}
if(map[j][k]=='#')
{
mark[j][k]=1;
}
if(map[j][k]=='S')
{
mark[j][k]=0;
st.x=j;
st.y=k;
if(j==n)
{
towards=0;
}
else if(k==m)
{
towards=1;
}
else if(j==1)
{
towards=2;
}
else if(k==1)
{
towards=3;
}
}
if(map[j][k]=='E')
{
mark[j][k]=0;
ed.x=j;
ed.y=k;
}
}
}
if(towards==0)
{
dfsl(st.x-1,st.y,0);
}
else if(towards==1)
{
dfsl(st.x,st.y-1,1);
}
else if(towards==2)
{
dfsl(st.x+1,st.y,2);
}
else if(towards==3)
{
dfsl(st.x,st.y+1,3);
}
printf("%d ",left);
if(towards==0)
{
dfsr(st.x-1,st.y,0);
}
else if(towards==1)
{
dfsr(st.x,st.y-1,1);
}
else if(towards==2)
{
dfsr(st.x+1,st.y,2);
}
else if(towards==3)
{
dfsr(st.x,st.y+1,3);
}
printf("%d ",right);
bfs(st.x,st.y);
}
}
POJ3083 - Children of the Candy Corn - 深度优先搜索+广度优先搜索
最新推荐文章于 2014-08-10 10:00:21 发布