COJ1224(ACM小组的古怪象棋)

题目链接

题目大意:棋盘上有一个马和一个帅,现给定棋盘的大小及马和帅的位置,假定帅不能移动,求马最少在多少步之内能吃到帅。

这题我WA了4次,第一个错误是没有考虑到帅可能会阻挡马的路线,第二个错误是初始化t[N][N]时不小心将两个循环中都写成了n,而棋盘的大小是n*m。

View Code
 1 #include <stdio.h>

 2 #include <string.h>

 3 #define MIN(a,b) ((a)<(b)?(a):(b))

 4 #define INF 0x7fffff

 5 #define N 20

 6 #define M 401

 7 struct node

 8 {

 9     int x,y;

10 }queue[M];

11 int front,rear;

12 int t[N][N];

13 int dx[8]={1,-1,-2,-2,-1,1,2,2};

14 int dy[8]={2,2,1,-1,-2,-2,-1,1};

15 int vis[N][N];

16 int n,m,si,sj,ei,ej;

17 void bfs(int x,int y)

18 {

19     int i,j,ni,nj,d;

20     front=rear=0;

21     for(i=0;i<n;i++)

22         for(j=0;j<m;j++)    t[i][j]=INF;

23     t[x][y]=0;

24     memset(vis,0,sizeof(vis));

25     vis[x][y]=1;

26     queue[rear].x=x,queue[rear++].y=y;

27     while(front!=rear)

28     {

29         i=queue[front].x,j=queue[front].y;

30         front=(front+1)%M;

31         for(d=0;d<8;d++)

32         {

33             ni=i+dx[d],nj=j+dy[d];

34             if(ni<0 || nj<0 || ni>=n || nj>=m || vis[ni][nj])  continue;

35             if(dx[d]==2&&ej==j&&ei==(i+1))  continue;

36             if(dx[d]==-2&&ej==j&&ei==(i-1)) continue;

37             if(dy[d]==2&&ei==i&&ej==(j+1))  continue;

38             if(dy[d]==-2&&ei==i&&j==(j-1))  continue;

39             t[ni][nj]=MIN(t[ni][nj],t[i][j]+1);

40             if(ni==ei&&nj==ej)  return;

41             vis[ni][nj]=1;

42             queue[rear].x=ni,queue[rear].y=nj;

43             rear=(rear+1)%M;

44         }

45     }

46 }

47 int main()

48 {

49     while(~scanf("%d%d%d%d%d%d",&n,&m,&ei,&ej,&si,&sj))

50     {

51         si--,sj--,ei--,ej--;

52         bfs(si,sj);

53         if(t[ei][ej]==INF)  printf("-1\n");

54         else    printf("%d\n",t[ei][ej]);

55     }

56     return 0;

57 }

你可能感兴趣的:(ACM)