A - Knight Moves

做这道题的时候遇到了两个问题,第一个真的是很奇怪,到现在都想不明白为什么,但确实是解决了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值