做这道题的时候遇到了两个问题,第一个真的是很奇怪,到现在都想不明白为什么,但确实是解决了。
1:输入问题
错误代码1:
while(scanf("%c%d%c%d",&a1,&n1,&a2,&n2));
数据输入的格式是:e2 e4,e2和e4之间是有空格的,所以scanf()里的第一个%c%d与第二个%c%d之间应该有个空格,因为如果没有空格的话,那么在输入完e2中的2后的空格就会被存入到字符变量a2里,而e就会被存到整型变量n2里,那么4这个数据就会丢掉。
当然上面的代码还有错误,也就是我说的很奇怪的地方,就是第一次输入,输出一行,但是以后每次输入都会连续输出两次。为啥?想了很久也没弄明白,后来隐隐的有种感觉就是铎姐说的getchar();的作用,当时想跟这有关系吗?但还是决定试一试,就在scanf();后加了一行getchar();
代码:
while(scanf("%c%d %c%d",&a1,&n1,&a2,&n2) != EOF)//
{
getchar();
}
其实现在我也没想明白为什么,这就是我之前说的虽然没想明白,但是问题确实解决了。
2:这个问题很重要,而且真的是很容易忽略的,如果不是那不知从何而来的灵感,真不知道自己能不能想出来。
在解决输入的问题后,再次执行程序就会发现程序刚执行时,输入的第一组数据的输出是正确的,但是第二次输入同样的数据,结果就会不同!这样应该是上一次程序执行时,有什么东西没处理干净,影响到了下一次的执行。会是哪里没有处理好呢?当找到了目标后break;跳出BFS()里的最外层的while()。但是,这样的话有可能此时队列里还有元素没有被pop()掉,对吧?因为调用pop()只是在while()里,如果跳出while(),那么pop()就不会执行了。
错误代码:
while(!Q.empty())
{
current = Q.front();
Q.pop();
if((current.row == (n2 - 1)) && (current.column == (a2 - 'a')))
{
printf("To get from %c%d to %c%d takes %d knight moves.\n",a1,n1,a2,n2,current.step);
break;
}
}
对吧?所以,在找到目标后还应该把队列pop()干净。
代码:
while(!Q.empty())
{
current = Q.front();
Q.pop();
if((current.row == (n2 - 1)) && (current.column == (a2 - 'a')))
{
printf("To get from %c%d to %c%d takes %d knight moves.\n",a1,n1,a2,n2,current.step);
while(!Q.empty())
{
Q.pop();
}
break;
}
}
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int row;
int column;
int step;
node(int row_,int column_,int step_)
{
row = row_;
column = column_;
step = step_;
}
};
struct node current(0,0,0);
queue<node> Q;
int x[8] = {1,2,2,1,-1,-2,-2,-1};
int y[8] = {-2,-1,1,2,2,1,-1,-2};
bool visit[9][9];
int n1,n2;
char a1,a2;
void BFS()
{
while(!Q.empty())
{
current = Q.front();
Q.pop();
if((current.row == (n2 - 1)) && (current.column == (a2 - 'a')))
{
printf("To get from %c%d to %c%d takes %d knight moves.\n",a1,n1,a2,n2,current.step);
while(!Q.empty())
{
Q.pop();
}
break;
}
for(int i = 0; i < 8; i++)
{
if((current.row + x[i] >= 0 && current.row + x[i] < 8) && (current.column + y[i] >= 0 && current.column + y[i] < 8))
if(visit[current.row + x[i]][current.column + y[i]] != 1)
{
visit[current.row + x[i]][current.column + y[i]] = 1;
Q.push(node(current.row + x[i],current.column + y[i],current.step + 1));
}
}
}
}
int main()
{
while(scanf("%c%d %c%d",&a1,&n1,&a2,&n2) != EOF)//
{
getchar();
memset(visit,0,sizeof(visit));
visit[n1 - 1][a1 - 'a'] = 1;
//printf("TEXT: %c %d\n",a2,n2);
Q.push(node(n1 - 1,a1 - 'a',0));
BFS();
}
return 0;
}
END