首先说迭代加深搜索
粗暴的理解就是给一个dfs模板加上一个深度限制,超过深度限制就return
然后没了...
https://www.luogu.com.cn/problem/P2324
那么这道题的最大深度就为15,即
int num=0;
dfs(int ans){
if(ans>num){//深度限制
IF=1;reuturn
}
...
}
...
for(;num<=15;num++){
dfs(0);
if(IF){
cout<<num;return 0;
}
}
cout<<-1;
这道题还要一个技巧,因为只有可以空,那么转换一下,不移动马,移动这个空(相当于移马)
并且我们可以发现,每个状态是有优劣的,优指此状态到目标需要步数小,劣反之
而这个可以与迭代加深搜索结合,我们预计一个状态到目标需要步数(最好情况)如果现有步数+预计步数>受深度限制也要return
代码:
#include<iostream>
using namespace std;
int num = 0;
int answer[6][6] = { {},
{0,1,1,1,1,1},
{0,0,1,1,1,1},
{0,0,0,-1,1,1},
{0,0,0,0,0,1},
{0,0,0,0,0,0} };
int a[9][9];
int dx[9] = { 0,-2,-2,-1,1,-1,1,2,2 };
int dy[9] = { 0,-1,1,2, 2,-2,-2,-1,1 };
bool IF = 0;
int check() {
int ans = 0;
for (int i = 1; i <=5; i++)for (int j = 1; j <= 5; j++)if (a[i][j] != answer[i][j])ans++;
return ans;
}
void dfs(int s,int x,int y) {
int chec = check();
if (s + check()-1> num) return;
if (!chec) {
IF = 1; return;
}
for(int k=1;k<=8;k++){
int xx = x + dx[k], yy = y + dy[k];
if (x >= 1 && x <= 5 && y >= 1 && y <= 5) {
swap(a[x][y], a[xx][yy]);
dfs(s + 1, xx, yy);
swap(a[x][y], a[xx][yy]);
}
}
}
int main() {
int t;
cin >> t;
while (t--) {
int x, y;IF = 0;
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
char ch; cin >> ch;
if (ch == '*')a[i][j] = -1,x=i,y=j;
else a[i][j] =ch-'0';
}
}
for (num = 0; num <= 15; num++) {
dfs(0,x,y);
if (IF) {
cout << num << endl; break;
}
}
if (!IF)cout << -1 << endl;
}
}