求助IDA*
  • 板块灌水区
  • 楼主fangzichang
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/7/4 15:07
  • 上次更新2023/10/27 21:54:45
查看原帖
求助IDA*
678087
fangzichang楼主2022/7/4 15:07

P2324

求助,第一次写IDA*,现在输入什么都输出-1,求帮忙看看找一下问题Orz,悬赏两个关注

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=10;
int n,ans,stx,sty;
int a[N][N],fx[10]={0,2,2,1,-1,-1,-2,-2,-1,1},fy[10]={0,1,-1,-2,-2,-1,1,2,2};//八个方向,顺时针,东南西北
int Ans[N][N]={{0,0,0,0,0,0},{0,2,2,2,2,2},{0,1,2,2,2,2},{0,1,1,0,2,2},{0,1,1,1,2,2},{0,1,1,1,1,2},{0,1,1,1,1,1}};//要求的状态
string s[N];
bool f;
int h(){//估价
	int sum=0;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(a[i][j]!=Ans[i][j]) sum++;//最乐观状态下还差几个
		}
	}
	return sum;
}
void dfs(int x,int y,int dep){
	if(dep==ans){
		if(!h()){
			f=1;//达到目标状态,退出
		} 
		return;
	}
	for(int i=1;i<=8;i++){
		int tox=x+fx[i],toy=y+fy[i];
		if(tox<=0||tox>5||toy<=0||toy>5) continue;//越界
		swap(a[x][y],a[tox][toy]);
		if(h()+dep>ans) continue;//估价超出
		dfs(tox,toy,dep+1);//搜索
		swap(a[x][y],a[tox][toy]);//回溯		
	}
	
}
int main(){
	cin>>n;
	while(n--){
		f=0;
		for(int i=1;i<=5;i++){
			cin>>s[i];
			for(int j=0;j<5;j++){
				if(s[i][j]=='0') a[i][j]=1;//白色
				else if(s[i][j]=='1') a[i][j]=2;//黑色
				else a[i][j]=0,stx=i,sty=j;//空地,也是搜索起点
			}
		}
		for(ans=0;ans<=15;ans++){
        //迭代加深
			dfs(stx,sty,0);
			if(f){
				cout<<ans<<endl;//成功
				break;
			}
		}
		if(!f)
		cout<<-1<<endl;//失败
	}
	
	return 0;
}

2022/7/4 15:07
加载中...