1.扯犊子超多if else 判断的代码,华丽丽的TLE。
#include<stdio.h> #include<string.h> #define N 1010 int map[N][N]; int f[4][2]= {0,1,1,0,0,-1,-1,0}; struct Node { int x,y; int f; }; int main() { int n; Node tig,don; while(scanf("%d",&n)!=EOF&&n) { memset(map,0,sizeof(map)); scanf("%d %d %d",&don.x,&don.y,&don.f); map[don.x][don.y]=-1; scanf("%d %d %d",&tig.x,&tig.y,&tig.f); map[tig.x][tig.y]=-2; int flag1=1,flag2=1; while(flag1||flag2) { //printf("#%d %d ",don.x,don.y); //printf("$%d %d ",tig.x,tig.y); if(don.x==tig.x&&don.y==tig.y) { printf("%d %d ",don.x,don.y); break; } if(flag1) { int x=don.x+f[don.f][0]; int y=don.y+f[don.f][1]; //printf("$%d %d ",x,y); if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-1&&map[x][y]!=-3) { //printf("sdafj "); don.x=x; don.y=y; } else if(y>=n) { x+=1; if(x>=0&&x<n&&map[x][don.y]!=-1&&map[x][don.y]!=-3)don.x=x; else flag1=0; don.f=1; } else if(x<0) { y+=1; if(y>=0&&y<n&&map[don.x][y]!=-1&&map[don.x][y]!=-3)don.y=y; else flag1=0; don.f=0; } else if(y<0) { x-=1; if(x>=0&&x<n&&map[x][don.y]!=-1&&map[x][don.y]!=-3)don.x=x; else flag1=0; don.f=3; } else if(x>=n) { y-=1; if(y>=0&&y<n&&map[don.x][y]!=-1&&map[don.x][y]!=-3)don.y=y; else flag1=0; don.f=2; } //else flag1=0; if(!map[don.x][don.y])map[don.x][don.y]=-1; else if(map[don.x][don.x]==-2)map[don.x][don.y]=-3; } if(flag2) { int x=tig.x+f[tig.f][0]; int y=tig.y+f[tig.f][1]; //printf(); if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-2&&map[x][y]!=-3) { tig.x=x; tig.y=y; } else if(y>=n) { x-=1; if(x>=0&&x<n&&map[x][tig.y]!=-2&&map[x][tig.y]!=-3)tig.x=x; else flag2=0; tig.f=3; } else if(x<0) { y-=1; if(y>=0&&y<n&&map[tig.x][y]!=-2&&map[tig.x][y]!=-3)tig.y=y; else flag2=0; tig.f=2; } else if(y<0) { x+=1; if(x>=0&&x<n&&map[x][tig.y]!=-2&&map[x][tig.y]!=-3)tig.x=x; else flag2=0; tig.f=1; } else if(x>=n) { y+=1; if(y>=0&&y<n&&map[tig.x][y]!=-2&&map[tig.x][y]!=-3)tig.y=y; else flag2=0; tig.f=0; } //else flag2=0; if(!map[tig.x][tig.y])map[tig.x][tig.y]=-2; else if(map[tig.x][tig.y]==-1)map[tig.x][tig.y]=-3; } } if(!flag1&&!flag2)printf("-1 "); } return 0; }
2.思路:
1.如果donkey和tiger能按指定路线行走,判断是否同时到达同意地点
2.如果不能继续行走(遇到自己以前走过的或墙壁),则转弯。
donkey向右转,tiger向左转,转后仍不能前进,则停下。
3.一个停下,另一个可以继续,直到都停下或同时到达同意地点。
不知道哪里错了(WA)
#include<stdio.h> #include<string.h> #define N 1100 int map[N][N]; int f[4][2]= {0,1,1,0,0,-1,-1,0}; struct Node { int x,y; int f; }; int main() { int n; while(scanf("%d",&n)!=EOF&&n) { Node tig,don; memset(map,0,sizeof(map)); scanf("%d %d %d",&don.x,&don.y,&don.f); map[don.x][don.y]=-1; scanf("%d %d %d",&tig.x,&tig.y,&tig.f); map[tig.x][tig.y]=-2; int flag1=1,flag2=1; while(flag1||flag2) { //printf("#%d %d ",don.x,don.y); //printf("$%d %d ",tig.x,tig.y); if(don.x==tig.x&&don.y==tig.y) { printf("%d %d ",don.x,don.y); break; } if(flag1) { int x=don.x+f[don.f][0]; int y=don.y+f[don.f][1]; //printf("$%d %d ",x,y); if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-1&&map[x][y]!=-3) { //printf("sdafj "); don.x=x; don.y=y; } else//换方向 { if(don.f==3) don.f=0; else don.f++; x=don.x+f[don.f][0]; y=don.y+f[don.f][1]; if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-1&&map[x][y]!=-3) { don.x=x; don.y=y; } else flag1=0; } if(flag1) if(!map[don.x][don.y])map[don.x][don.y]=-1; else if(map[don.x][don.x]==-2)map[don.x][don.y]=-3; } if(flag2) { int x=tig.x+f[tig.f][0]; int y=tig.y+f[tig.f][1]; //printf(); if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-2&&map[x][y]!=-3) { tig.x=x; tig.y=y; } else { if(!tig.f) tig.f=3; else tig.f--; x=tig.x+f[tig.f][0]; y=tig.y+f[tig.f][1]; if(x>=0&&x<n&&y>=0&&y<n&&map[x][y]!=-2&&map[x][y]!=-3) { tig.x=x; tig.y=y; } else flag2=0; } if(flag2) if(!map[tig.x][tig.y])map[tig.x][tig.y]=-2; else if(map[tig.x][tig.y]==-1)map[tig.x][tig.y]=-3; } } if(!flag1&&!flag2)printf("-1 "); } return 0; }