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 |
Re:不知道怎么wa的 1915也过了的In Reply To:不知道怎么wa的 1915也过了的 Posted by:happynp at 2007-05-23 15:06:57 > #include <stdio.h> > #include <math.h> > #include <memory.h> > #define N 9 > int chess[N][N]; > const int lenQuene = N*N; > int d[8][2] = {-2,-1, > -2, 1, > -1,-2, > -1, 2, > 2,-1, > 2, 1, > 1,-2, > 1, 2}; > typedef struct Point > { > int x, y; > }Point; > > typedef struct Quene > { > Point *base; > int head; > int rear; > }Quene; > Quene S,E; //全局队列 > void Init(Quene &q) > { > q.base = new Point[lenQuene]; > q.head = 0; > q.rear = 0; > } > > void Destroy(Quene &q) > { > delete []q.base; > } > > bool IsEmpty(Quene &q) > { > if(q.head == q.rear) > return true; > else > return false; > } > > bool IsFull(Quene &q) > { > if((q.rear + 1)%lenQuene == q.head) > return true; > else > return false; > } > > bool EnQuene(Quene &q, Point &p) //insert > { > if(IsFull(q)) > return false; > q.base[q.rear] = p; > q.rear = (q.rear+1)%lenQuene; > return true; > } > > bool DeQuene(Quene &q, Point &p) //delete > { > if(IsEmpty(q)) > return false; > p = q.base[q.head]; > q.head = (q.head+1)%lenQuene; > return true; > } > > bool inner(Point s, int l) > { > if(s.x>=0 && s.x<l && s.y>=0 && s.y<l) > return true; > else > return false; > } > > int BFS(Point s, Point e, int l) > { > if(s.x == e.x && s.y == e.y) //起始相同 > return 0; > > float k = ((float)abs(s.y-e.y))/((float)abs(s.x-e.x)); //直线情况 > if( k==2.0 ) > return abs(s.y-e.y)/2; > if( k==0.5) > return abs(s.y-e.y); > > int i = 0 , j = 0; > Point Shere = s, Snbr; //起点 > Point Ehere = e, Enbr; //终点 > do{ > for(i = 0; i<8; i++) > { > Snbr.x = Shere.x + d[i][0]; > Snbr.y = Shere.y + d[i][1]; > if(inner(Snbr,l)) > { > if(chess[Snbr.x][Snbr.y]==0) > { > chess[Snbr.x][Snbr.y] = chess[Shere.x][Shere.y] + 1; > if(Snbr.x == Ehere.x && Snbr.y == Ehere.y) > return chess[Snbr.x][Snbr.y] - chess[Ehere.x][Ehere.y] + 1; > for(j = 0; j<8 ; j++) > { > Enbr.x = Ehere.x + d[j][0]; > Enbr.y = Ehere.y + d[j][1]; > if(inner(Enbr,l)) > { > if(chess[Enbr.x][Enbr.y]==0) > { > chess[Enbr.x][Enbr.y] = chess[Ehere.x][Ehere.y] - 1; > EnQuene(E,Enbr); > } > else if(chess[Enbr.x][Enbr.y]>0) > return chess[Enbr.x][Enbr.y] - chess[Ehere.x][Ehere.y] + 1; > } > } > EnQuene(S,Snbr); > } > else if(chess[Snbr.x][Snbr.y] < 0) > return chess[Shere.x][Shere.y] - chess[Snbr.x][Snbr.y] + 1; > } > else > continue; > } > }while(DeQuene(S,Shere)||DeQuene(E,Ehere)); > } > int main() > { > char str1[3],str2[3]; > Point s , e; > int ans; > while(EOF!=scanf("%s",str1)) > { > Init(S); > Init(E); > scanf("%s",str2); > s.x = int(str1[0] - 'a') - 1; > s.y = int(str1[1] - '0') - 1; > e.x = int(str2[0] - 'a') - 1; > e.y = int(str2[1] - '0') - 1; > memset(chess,0,sizeof(int)*N*N); > ans = BFS(s,e,8); > printf("To get from %s to %s takes %d knight moves.\n",str1,str2,ans); > Destroy(S); > Destroy(E); > } > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator