简单搜索问题,然后刚开始我用的DFS,超时,
后面改用BFS,才过的…
DFS代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a1[9][9]={0};
int a2[8][2]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
int x1,x2,y1,y2;
int sum,ans;
void DFS(int x,int y,int ans)
{
if(x==x2&&y==y2) //找到目标
{
sum=ans;
return;
}
if(ans>sum) //剪枝
return;
else
{
for(int i=0;i<8;i++)
{
int X=x+a2[i][0];
int Y=y+a2[i][1];
if(X>0&&X<=8&&Y>0&&Y<=8&&a1[X][Y]!=1)
{
a1[X][Y]=1;
DFS(X,Y,ans+1);
a1[X][Y]=0;
}
}
}
return;
}
int main()
{
char c[6];
while(gets(c))
{
memset(a1,0,sizeof(a1));
x1=c[0]-'a'+1; //起点
x2=c[3]-'a'+1; //终点
y1=c[1]-'0'; //起点
y2=c[4]-'0'; //终点
sum=999;
ans=0;
a1[x1][y1]=1;
DFS(x1,y1,ans);
printf("%d\n",sum);
}
return 0;
}
BFS代码:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int a1[9][9]={0};
int a2[8][2]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
int x1,x2,y1,y2;
int sum,ans;
queue < int > q1;
void BFS()
{
while(!q1.empty())
{
int x=q1.front();
q1.pop();
int y=q1.front();
q1.pop();
ans=q1.front();
q1.pop();
if(x==x2&&y==y2)
{
sum=ans;
return;
}
if(ans>sum)
return;
for(int i=0;i<8;i++)
{
int X=x+a2[i][0];
int Y=y+a2[i][1];
if(X>0&&X<=8&&Y>0&&Y<=8&&a1[X][Y]!=1)
{
q1.push(X);
q1.push(Y);
q1.push(ans+1);
a1[X][Y]=1;
}
}
}
return;
}
int main()
{
char c[6];
while(gets(c))
{
memset(a1,0,sizeof(a1));
while(!q1.empty())
q1.pop();
x1=c[0]-'a'+1;
x2=c[3]-'a'+1;
y1=c[1]-'0';
y2=c[4]-'0';
sum=999;
ans=0;
a1[x1][y1]=1;
q1.push(x1);
q1.push(y1);
q1.push(ans);
BFS();
printf("To get from %c%c to %c%c takes %d knight moves.\n",c[0],c[1],c[3],c[4],sum);
}
return 0;
}