萌新求助IDA*,调了两天了……
查看原帖
萌新求助IDA*,调了两天了……
161364
Walker_V楼主2020/10/31 14:57

这道题应该我先用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;
}
2020/10/31 14:57
加载中...