这道题应该我先用BFS过了,之后觉得应该是可以IDA*的,结果这代码就死活调不出来……
现在的情况是max_dep=1时一切正常,当大于2时就不对了,之后会一直死循环……
调试代码和注释我都没删,各位可以帮忙看一下有什么显而易见的问题吗?谢谢了!
(注意在本机跑这份代码会死循环!)
#include<bits/stdc++.h>
int max_dep;
int f[10][10],dx[9]={0,-1,-2,-2,-1,1,2,2,1},dy[9]={0,2,1,-1,-2,-2,-1,1,2};
char op[5],ed[5];
struct node {
int x,y;
}s,t;
namespace WalkerV {
void Init() {
max_dep=0;
memset(f,0,sizeof(f));
return;
}
int M_dis(int x1,int y1,int x2,int y2) {
return std::abs(x1-x2)+std::abs(y1-y2);
}
bool IDDFS(int x,int y,int dep) {
f[x][y]=dep;
if(x==t.x&&y==t.y) {
printf("OK x:%d y:%d dep:%d f:%d\n",x,y,dep,f[x][y]);
return true;
}
printf("x:%d y:%d g(x):%d f(x):%.1f\n",x,y,dep,std::ceil(M_dis(x,y,t.x,t.y)/3.0));
if(dep+std::ceil(M_dis(x,y,t.x,t.y)/3.0)>max_dep) { //dep:g(x),M_dis/3:f(x)
printf("sumcut\n");
return false;
}
if(dep>max_dep) {
printf("selfcut\n");
return false;
}
for(int i=1;i<=8;i++) {
if(x+dx[i]>=1&&x+dx[i]<=8&&y+dy[i]>=1&&y+dy[i]<=8&&!f[x+dx[i]][y+dy[i]]) {
if(IDDFS(x+dx[i],y+dy[i],dep+1)) {
return true;
}
}
}
return false;
}
void Solve() {
s=(node){op[0]-'a'+1,op[1]-'0'},t=(node){ed[0]-'a'+1,ed[1]-'0'};
while(!IDDFS(s.x,s.y,0)) {
max_dep++;
printf("max_dep:%d\n",max_dep);
if(max_dep>3) {
return;
}
}
return;
}
void Print() {
printf("To get from %s to %s takes %d knight moves.\n",op,ed,f[t.x][t.y]);
memset(op,0,sizeof(op));
memset(ed,0,sizeof(ed));
return;
}
}
int main()
{
while(std::cin>>op>>ed) {
WalkerV::Init();
WalkerV::Solve();
WalkerV::Print();
}
return 0;
}