社区讨论

萌新求助IDA*,调了两天了……

UVA439骑士的移动 Knight Moves参与者 3已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@lod19huz
此快照首次捕获于
2023/10/30 23:06
2 年前
此快照最后确认于
2023/11/05 09:24
2 年前
查看原帖
这道题应该我先用BFS过了,之后觉得应该是可以IDA*的,结果这代码就死活调不出来……
现在的情况是max_dep=1时一切正常,当大于2时就不对了,之后会一直死循环……
调试代码注释我都没删,各位可以帮忙看一下有什么显而易见的问题吗?谢谢了!
(注意在本机跑这份代码会死循环!)
CPP
#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;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...