之前没有学过队列,这两天了解了一下,C++标准库里有queue类,可以直接使用。但这里,我尝试着根据队列的原理,用数组储存队列,关键是用数组下表控制好进出队。
(更多队列的知识请参考:http://baike.baidu.com/view/2394062.htm)
#include<iostream> #include<string.h> using namespace std; int main() { short m,n,x,y,k=0,x1,y1; int i,j,d,e,ii; short c[20][20],a[400][2]; short bo; short dx[8]={1,1,2,2,-1,-1,-2,-2},dy[8]={2,-2,1,-1,2,-2,1,-1}; k=0; cin>>n>>m>>x>>y>>x1>>y1; x--;y--;x1--;y1--; a[0][0]=x;a[0][1]=y; memset(c,0,sizeof(c)); i=0;d=0;e=-1;bo=1; while (bo) { k++; d=e+1;e=i; if (d>e) break; for (j=d;j<=e;j++) { for (ii=0;ii<8;ii++) { x=a[j][0]+dx[ii]; y=a[j][1]+dy[ii]; if (x==x1&&y==y1) { bo=0; j=e+2; break; } else if (!c[x][y]&&x>=0&&x<n&&y>=0&&y<m) { i++; a[i][0]=x; a[i][1]=y; c[x][y]=1; } } } } if (x!=x1||y!=y1) k=-1; cout<<k<<endl; return 0; }
改为C++输入输出流后的代码:
#include<stdio.h> #include<string.h> int main() { short m,n,x,y,k=0,x1,y1; int i,j,d,e,ii; short c[20][20],a[400][2]; short bo; short dx[8]={1,1,2,2,-1,-1,-2,-2},dy[8]={2,-2,1,-1,2,-2,1,-1}; scanf("%d%d%d%d%d%d",&n,&m,&x,&y,&x1,&y1); x--;y--;x1--;y1--; k=0; a[0][0]=x;a[0][1]=y; memset(c,0,sizeof(c)); i=0;d=0;e=-1;bo=1; while (bo) { k++; d=e+1;e=i; if (d>e) break; for (j=d;j<=e;j++) { for (ii=0;ii<8;ii++) { x=a[j][0]+dx[ii]; y=a[j][1]+dy[ii]; if (x==x1&&y==y1) { bo=0; j=e+2; break; } else if (!c[x][y]&&x>=0&&x<n&&y>=0&&y<m) { i++; a[i][0]=x; a[i][1]=y; c[x][y]=1; } } } } if (x!=x1||y!=y1) k=-1; printf("%d\n",k); return 0; }