BFS求最短路有关问题:杭电OJ1372 跳马
BFS求最短路问题:杭电OJ1372 跳马
问题意思是在8*8的棋盘上,马从一个坐标跳到另一坐标的最小步数.
我这样求有什么问题?我只检验了一下步数。发现错了,我想了好久,我把这个问题看成是一棵树了,最小步数应该是最后到达的层数。这样有错么,望高人指导啊。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
struct node{int x,y,step;};
queue<node>que;
bool matrix[9][9];
int ax,ay,bx,by;
node cur;
int bfs()
{
int i;
if(ax==bx&&ay==by)return 0;
cur.x=ax,cur.y=ay,cur.step=0;
matrix[ax][ay]=1;
que.push(cur);
while(!que.empty())
{
cur=que.front(),que.pop();
cur.step++;
for(i=0;i<8;i++)
{
ax=cur.x+dir[i][0];
ay=cur.y+dir[i][1];
if(ax>0&&ax<9&&ay>0&&ay<9)
{
matrix[ax][ay]=1;
cout<<ax<<" "<<ay<<endl;
if(ax==bx&&ay==by)return cur.step;
cur.x=ax,cur.y=ay;
que.push(cur);
}
}
}
return -1;
}
int main()
{
char t1,t2;
while(cin>>t1>>ay>>t2>>by)
{
ax=t1-'a'+1;bx=t1-'a'+1;
memset(matrix,0,sizeof(matrix));
cout<<bfs()<<endl;
}
return 0;
}
------解决方案--------------------
while(!que.empty())
{
cur=que.front(),que.pop();
cur.step++;
for(i=0;i<8;i++)
{
ax=cur.x+dir[i][0];
ay=cur.y+dir[i][1];
if(ax>0&&ax<9&&ay>0&&ay<9)
{
matrix[ax][ay]=1;
cout<<ax<<" "<<ay<<endl;
if(ax==bx&&ay==by)return cur.step;
cur.x=ax,cur.y=ay;
que.push(cur);
}
}
}
这里step计算有点问题吧。每次出队的时候把step++,我感觉应该是每次入队的时候把step记为父节点的step+1吧。改为:
while(!que.empty())
{
cur=que.front(),que.pop();
//cur.step++;
for(i=0;i<8;i++)
{
ax=cur.x+dir[i][0];
ay=cur.y+dir[i][1];
tmp=cur.step;
if(ax>0&&ax<9&&ay>0&&ay<9)
{
matrix[ax][ay]=1;
cout<<ax<<" "<<ay<<endl;
cur.x=ax,cur.y=ay;
cur.step=tmp++;
if(ax==bx&&ay==by)return cur.step;
que.push(cur);
}
}
}
问题意思是在8*8的棋盘上,马从一个坐标跳到另一坐标的最小步数.
我这样求有什么问题?我只检验了一下步数。发现错了,我想了好久,我把这个问题看成是一棵树了,最小步数应该是最后到达的层数。这样有错么,望高人指导啊。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
struct node{int x,y,step;};
queue<node>que;
bool matrix[9][9];
int ax,ay,bx,by;
node cur;
int bfs()
{
int i;
if(ax==bx&&ay==by)return 0;
cur.x=ax,cur.y=ay,cur.step=0;
matrix[ax][ay]=1;
que.push(cur);
while(!que.empty())
{
cur=que.front(),que.pop();
cur.step++;
for(i=0;i<8;i++)
{
ax=cur.x+dir[i][0];
ay=cur.y+dir[i][1];
if(ax>0&&ax<9&&ay>0&&ay<9)
{
matrix[ax][ay]=1;
cout<<ax<<" "<<ay<<endl;
if(ax==bx&&ay==by)return cur.step;
cur.x=ax,cur.y=ay;
que.push(cur);
}
}
}
return -1;
}
int main()
{
char t1,t2;
while(cin>>t1>>ay>>t2>>by)
{
ax=t1-'a'+1;bx=t1-'a'+1;
memset(matrix,0,sizeof(matrix));
cout<<bfs()<<endl;
}
return 0;
}
------解决方案--------------------
while(!que.empty())
{
cur=que.front(),que.pop();
cur.step++;
for(i=0;i<8;i++)
{
ax=cur.x+dir[i][0];
ay=cur.y+dir[i][1];
if(ax>0&&ax<9&&ay>0&&ay<9)
{
matrix[ax][ay]=1;
cout<<ax<<" "<<ay<<endl;
if(ax==bx&&ay==by)return cur.step;
cur.x=ax,cur.y=ay;
que.push(cur);
}
}
}
这里step计算有点问题吧。每次出队的时候把step++,我感觉应该是每次入队的时候把step记为父节点的step+1吧。改为:
while(!que.empty())
{
cur=que.front(),que.pop();
//cur.step++;
for(i=0;i<8;i++)
{
ax=cur.x+dir[i][0];
ay=cur.y+dir[i][1];
tmp=cur.step;
if(ax>0&&ax<9&&ay>0&&ay<9)
{
matrix[ax][ay]=1;
cout<<ax<<" "<<ay<<endl;
cur.x=ax,cur.y=ay;
cur.step=tmp++;
if(ax==bx&&ay==by)return cur.step;
que.push(cur);
}
}
}