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 |
谁帮我测测这个程序,不知道为什么总是wa#include<stdio.h> #include<stdlib.h> #include<string.h> #define MIN(a,b) ((a>b)?b:a) short flag[500][500][3];//三种状态,0 代表直立,1代表向下躺,2代表向右躺 char plane[510][510]; struct queue { short x,y; short stat; short step; }q[85000]; int start[2][2],target[2]; int start_len,m,n; int front,tail; int move[3][4][3]={{{0,-2,1},{0,1,1},{-2,0,2},{1,0,2}}, {{0,-1,0},{0,2,0},{-1,0,1},{1,0,1}},{{0,-1,2},{0,1,2},{-1,0,0},{2,0,0}}}; void init() { int i,j; memset(flag,0,sizeof(flag)); memset(plane,'#',sizeof(plane)); start_len=0; getchar(); for(i=0;i<m;i++) { for(j=0;j<n;j++) { plane[i][j]=getchar(); if(plane[i][j]=='X') { start[start_len][0]=j; start[start_len++][1]=i; } if(plane[i][j]=='O') { target[0]=j; target[1]=i; } } // plane[i][j]='\0'; getchar(); } } void solve() { front=0; int i,x,y,stat; if(start_len==1) { q[front].x=start[start_len-1][0]; q[front].y=start[start_len-1][1]; q[front].stat=0; q[front].step=1; } else { if(start[start_len-2][0]==start[start_len-1][0]) { q[front].x=start[start_len-2][0]; q[front].y=MIN(start[start_len-1][1],start[start_len-2][1]); q[front].stat=1; q[front].step=1; } else { q[front].x=MIN(start[start_len-2][0],start[start_len-1][0]); q[front].y=start[start_len-2][1]; q[front].stat=2; q[front].step=1; } } flag[q[front].y][q[front].x][q[front].stat]=1; tail=1; flag[target[1]][target[0]][0]=(short)65536; while(front<tail) { x=q[front].x; y=q[front].y; stat=q[front].stat; if(q[front].x==target[0] && q[front].y==target[1] && q[front].stat==0 && flag[target[1]][target[0]][0]>q[front].step) flag[target[1]][target[0]][0]=q[front].step; for(i=0;i<4;i++) { if(move[stat][i][2]==0) { if((x+move[stat][i][0]>0 && x+move[stat][i][0]<n-1) && (y+move[stat][i][1]>0 && y+move[stat][i][1]<m-1)) { if(plane[y+move[stat][i][1]][x+move[stat][i][0]]!='#' && plane[y+move[stat][i][1]][x+move[stat][i][0]]!='E') { if(flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]==0 || (flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]>(q[front].step+1))) { q[tail].x=x+move[stat][i][0]; q[tail].y=y+move[stat][i][1]; q[tail].stat=move[stat][i][2]; q[tail++].step=q[front].step+1; flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]=q[front].step+1; } } } } else if(move[stat][i][2]==1) { if((x+move[stat][i][0]>0 && x+move[stat][i][0]<n-1) && (y+move[stat][i][1]>0 && y+move[stat][i][1]<m-1)) { if((y+move[stat][i][1]+1>0 && y+move[stat][i][1]+1<m-1)) { if(plane[y+move[stat][i][1]][x+move[stat][i][0]]!='#') { if(plane[y+move[stat][i][1]+1][x+move[stat][i][0]]!='#') { if(flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]==0 || (flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]>(q[front].step+1))) { q[tail].x=x+move[stat][i][0]; q[tail].y=y+move[stat][i][1]; q[tail].stat=move[stat][i][2]; q[tail++].step=q[front].step+1; flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]=q[front].step+1; } } } } } } else if(move[stat][i][2]==2) { if((x+move[stat][i][0]>0 && x+move[stat][i][0]<n-1) && (y+move[stat][i][1]>0 && y+move[stat][i][1]<m-1)) { if((x+move[stat][i][0]+1>0 && x+move[stat][i][0]+1<n-1)) { if(plane[y+move[stat][i][1]][x+move[stat][i][0]]!='#') { if(plane[y+move[stat][i][1]][x+move[stat][i][0]+1]!='#') { if(flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]==0 || (flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]>(q[front].step+1))) { q[tail].x=x+move[stat][i][0]; q[tail].y=y+move[stat][i][1]; q[tail].stat=move[stat][i][2]; q[tail++].step=q[front].step+1; flag[y+move[stat][i][1]][x+move[stat][i][0]][move[stat][i][2]]=q[front].step+1; } } } } } } } front++; } } int main() { //int step; while(scanf("%d%d",&m,&n)!=EOF && (m+n)!=0) { init(); if(m==3 && n==3) { printf("Impossible\n"); continue; } if(start_len==2 &&( start[0][0]==target[0] && start[0][1]==target[1])) { printf("0\n"); continue; } solve(); if(flag[target[1]][target[0]][0]==0) printf("Impossible\n"); else printf("%d\n",flag[target[1]][target[0]][0]-1); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator