pku3083Children of the Candy Corn
模拟的部分写了一下午
写bfs的时候还不知道什么是bfs……
然后去写bfs模板题(记录在前两篇博客里)
然后贴bfs完成后就一直Runtime Error。。。
因为开的数组是 mp[40][40] ,然后数据里正好有 40*40 就杯具的Runtime Error了十多次
#include#include #include #include 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 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#include #include #include 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 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