pku3083Children of the Candy Corn
模拟的部分写了一下午
写bfs的时候还不知道什么是bfs……
然后去写bfs模板题(记录在前两篇博客里)
然后贴bfs完成后就一直Runtime Error。。。
因为开的数组是 mp[40][40] ,然后数据里正好有 40*40 就杯具的Runtime Error了十多次
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char mp[45][45];
int X,Y,flag;
// 上 右 下 左 上 右 下 左 上
int dir[11][3]={{-1,0},{0,1},{1,0},{0,-1},{-1,0},{0,1},{1,0},{0,-1},{-1,0},{0,1},{1,0}};
// 1 2 3 4 5 6 7 8 9
struct point
{
int x,y,t;
};
int protect(int x)
{
if(x>=5) while(x>=5) x-=4;
else if(x<=0) while(x<=0) x+=4;
return x;
}
int to(int d,int x,int y,int from)
{
if(d==-1)
{
for(int i=-1;i<=2;i++)
if(mp[y+dir[protect(from+i)][1]][x+dir[protect(from+i)][0]]!='#')
return protect(from+i);
}
else
{
for(int i=1;i>=-2;i--)
if(mp[y+dir[protect(from+i)][1]][x+dir[protect(from+i)][0]]!='#')
return protect(from+i);
}
return 0;
}
void bfs(int x,int y)
{
int i;
point t,tt;
queue<point>Q;
t.x=x;t.y=y;t.t=1;
mp[y][x]='#';
Q.push(t);
while(!Q.empty())
{
t=Q.front();Q.pop();
// printf("%d,%d - %d\n",t.x,t.y,t.t);
for(i=1;i<=4;i++)
{
tt.x=t.x+dir[i][0];
tt.y=t.y+dir[i][1];
tt.t=t.t+1;
if(tt.x<1||tt.x>X||tt.y<1||tt.y>Y||mp[tt.y][tt.x]=='#') continue;
if(mp[tt.y][tt.x]=='E')
{
printf(" %d\n",tt.t);
return;
}
mp[tt.y][tt.x]='#';
Q.push(tt);
}
}
return;
}
int main()
{
int a,b,c,d,i,j,T,Sx,Sy,Sdir,L,R,S,x,y,next;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&X,&Y);
getchar();
for(i=Y;i>=1;i--)
{
for(j=1;j<=X;j++)
{
scanf("%c",&mp[i][j]);
if(mp[i][j]=='S') Sy=i,Sx=j;
}
getchar();
}
//for(i=Y;i>=1;i--) printf("%s\n",mp[i]+1);
//printf("起点 %d %d\n",Sx,Sy);
//while(scanf("%d%d%d%d",&a,&b,&c,&d)) printf("%d\n",to(a,b,c,d));
L=R=S=1;
if(Sx==1) Sdir=2;
else if(Sy==1) Sdir=1;
else if(Sx==X) Sdir=4;
else Sdir=3;
x=Sx,y=Sy,next=Sdir;
while(mp[y][x]!='E')
{
next=to(1,x,y,next);//printf("next=%d",next);
x+=dir[next][0];
y+=dir[next][1];
// printf(" mp(%d,%d) =%c\n",x,y,mp[y][x]);system("pause");
R++;
}
x=Sx,y=Sy,next=Sdir;
while(mp[y][x]!='E')
{
next=to(-1,x,y,next);//printf("next=%d",next);
x+=dir[next][0];
y+=dir[next][1];
// printf(" mp(%d,%d) =%c\n",x,y,mp[y][x]);system("pause");
L++;
}
flag=0;
printf("%d %d",L,R);
bfs(Sx,Sy);
}
return 0;
}
缩减版,,,
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char mp[45][45];
int X,Y;
int dir[5][2]={{-1,0},{0,1},{1,0},{0,-1},{-1,0}};
struct point{
int x,y,t;
};
int protect(int x)
{
if(x>=5) x-=4;
else if(x<=0) x+=4;
return x;
}
int to(int d,int x,int y,int from)
{
for(int i=-1;i<=2;i++)
if(mp[y+dir[protect(from+-1*d*i)][1]][x+dir[protect(from+-1*d*i)][0]]!='#')
return protect(from+-1*d*i);
return 0;
}
void bfs(int x,int y)
{
int i;
point t,tt;
queue<point>Q;
t.x=x;t.y=y;t.t=1; mp[y][x]='#'; Q.push(t);
while(!Q.empty())
{
t=Q.front();Q.pop();
for(i=1;i<=4;i++)
{
tt.x=t.x+dir[i][0]; tt.y=t.y+dir[i][1]; tt.t=t.t+1;
if(tt.x<1||tt.x>X||tt.y<1||tt.y>Y||mp[tt.y][tt.x]=='#') continue;
if(mp[tt.y][tt.x]=='E')
{
printf(" %d\n",tt.t);
return;
}
mp[tt.y][tt.x]='#'; Q.push(tt);
}
}
}
int main()
{
int i,j,T,Sx,Sy,Sdir,L,R,S,x,y,next;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&X,&Y); getchar();
for(i=Y;i>=1;i--,getchar())
{
for(j=1;j<=X;j++)
{
scanf("%c",&mp[i][j]);
if(mp[i][j]=='S') Sy=i,Sx=j;
}
}
L=R=S=1;
if(Sx==1) Sdir=2;
else if(Sy==1) Sdir=1;
else if(Sx==X) Sdir=4;
else Sdir=3;
x=Sx,y=Sy,next=Sdir;
while(mp[y][x]!='E')
{
next=to(1,x,y,next);
x+=dir[next][0];
y+=dir[next][1];
R++;
}
x=Sx,y=Sy,next=Sdir;
while(mp[y][x]!='E')
{
next=to(-1,x,y,next);
x+=dir[next][0];
y+=dir[next][1];
L++;
}
printf("%d %d",L,R);
bfs(Sx,Sy);
}
return 0;
}
更多详细信息请查看 java教程网 http://www.itchm.com/forum-59-1.html