之前没有学过队列,这两天了解了一下,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;
}
但是,不知道为什么把scanf和printf改成cin和cout评测就通不过了,总是答案错误。在此,先把问题搁置,大家有什么高见,请赐教,谢谢!( 题目来源csuoj 1224)
改为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;
}