没多想,直接敲的BFS,看了discuss,表示很惭愧,居然没动脑,敲了NC的BFS,这得多敲多少代码呀...
#include<iostream> #include<cstdio> #include<cstring> using namespace std; bool vis[10][10]; char star[3],end[3]; struct go_to { int x,y,step; }tt[3],queue[1000]; int dir[][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{-1,1},{1,-1},{1,1}}; int rear=0,front=0; void solve1() { rear=0;front=0; rear++; queue[rear].x=tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i; while(front!=rear) { front++; for(i=0;i<8;i++) { int tempx=queue[front].x +dir[i][0]; int tempy=queue[front].y+dir[i][1]; if(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d ",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } } } } printf("Inf "); } void solve2() { rear=0;front=0; rear++; queue[rear].x =tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i,j,k; while(front!=rear) { front++; for(i=0;i<8;i++) { int tempx=queue[front].x+dir[i][0]; int tempy=queue[front].y+dir[i][1]; while(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d ",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } tempx=tempx+dir[i][0]; tempy=tempy+dir[i][1]; } } } printf("Inf "); } void solve3() { rear=0;front=0; rear++; queue[rear].x =tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i,j,k; while(front!=rear) { front++; for(i=0;i<4;i++) { int tempx=queue[front].x+dir[i][0]; int tempy=queue[front].y+dir[i][1]; while(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d ",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } tempx=tempx+dir[i][0]; tempy=tempy+dir[i][1]; } } } printf("Inf "); } void solve4() { rear=0;front=0; rear++; queue[rear].x =tt[0].x;queue[rear].y=tt[0].y;queue[rear].step =0; memset(vis,true,sizeof(vis)); vis[tt[0].x][tt[0].y]=false; int i,j,k; while(front!=rear) { front++; for(i=4;i<8;i++) { int tempx=queue[front].x+dir[i][0]; int tempy=queue[front].y+dir[i][1]; while(tempx>=1&&tempx<=8&&tempy>=1&&tempy<=8) { if(vis[tempx][tempy]) { if(tempx==tt[1].x&&tempy==tt[1].y){ printf("%d\n",queue[front].step +1); return ; } else { rear++;queue[rear].x=tempx;queue[rear].y=tempy; queue[rear].step=queue[front].step +1; vis[tempx][tempy]=false; } } tempx=tempx+dir[i][0]; tempy=tempy+dir[i][1]; } } } printf("Inf\n"); } void solve() { solve1(); solve2(); solve3(); solve4(); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s%s",&star,&end); tt[0].x=star[0]-'a'+1;tt[0].y=star[1]-'0'; tt[1].x=end[0]-'a'+1;tt[1].y=end[1]-'0'; if(tt[0].x==tt[1].x&&tt[0].y==tt[1].y) printf("%d %d %d %d\n",0,0,0,0); else solve(); } return 0; }