第31个点到底是的啥?—— IDA*求调!
查看原帖
第31个点到底是的啥?—— IDA*求调!
519573
Daniel_yao楼主2023/1/10 11:58
#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007

using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 15;

const int dx[N] = {0,1,-1,0};
const int dy[N] = {1,0,0,-1}; 

const int st[N][N] = {
	{0,0,0,0},
	{0,1,2,3},
	{0,8,0,4},
	{0,7,6,5},
};

char s[N];

int a[N][N], sx, sy, maxdep, f;

int F() {
	int cnt = 0;
	For(i,1,3) For(j,1,3) cnt += (st[i][j] != a[i][j]);
	return cnt;
}

bool check(int x, int y) {
	if(x < 1 || x > 3 || y < 1 || y > 3) return 0;
	return 1; 
}

void A_star(int x, int y, int dep, int pre) {
	if(f) return ;
	if(dep == maxdep) {
		if(!F()) f = 1;
		return ;
	}
	For(i,0,3) {
		int nx = x + dx[i], ny = y + dy[i];
		if(!check(nx, ny) || pre + i == 3) continue;
		swap(a[x][y], a[nx][ny]);
		int exp = F();
		if(exp + dep <= maxdep) A_star(nx, ny, dep + 1, i);
		swap(a[x][y], a[nx][ny]);
	}
} 

signed main() {
	scanf("%s", s + 1);
	For(i,1,3) {
		For(j,1,3) {
			a[i][j] = s[(i-1)*3+j] - '0';
			if(a[i][j] == 0) sx = i, sy = j;
		}
	}
	if(!F()) puts("0");
	for (maxdep = 1; ; maxdep++) {
		A_star(sx, sy, 0, -1);
		if(f) {
			cout << maxdep << '\n';
			break;
		}
	} 
  return 0;
}

第三十一个点总是过不去,求调!!

2023/1/10 11:58
加载中...