MisakaMKT

迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神

在这里插入图片描述

题目

此题根据题目可知是迭代加深搜索。
首先应该枚举空格的位置,让空格像一个马一样移动。
但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题。
感觉也想不出什么减枝,于是便要用到了乐观估计函数Optimistic Estimation Function
以3种颜色的格子来表示原棋盘:
在这里插入图片描述
如果我们要从一个状态抵达到原棋盘,那么需要的步数绝对是小于当前状态与原棋盘不同的格子的数量、
那么我们的乐观估计函数就出来了。如果当前状态与原棋盘的不同格子数量小于我们的剩余的步数,那么肯定是抵达不了的,return回去就行。

代码

#include <iostream>
#include <cstring>
using namespace std;
 
#define N 510
 
int dir[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,-2},{-1,2}};
int fuck[10][10]={{0,0,0,0,0,0},{0,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1}};
int a[10][10],T,px,py,len,flag=0;
 
int dif() {
    int sum=0;
    for(int i=1;i<=5;i++) for(int j=1;j<=5;j++)
        if(a[i][j] != fuck[i][j]) 
            sum++;
    return sum;
}
 
void dfs(int step) {
    if(step>len) {
        if(dif()==0) flag=1;
        return ;
    }
    if(dif()>len-step+2) return ;
    for(int k=0;k<8;k++) {
        int tx=px+dir[k][0],ty=py+dir[k][1];
        if(  tx<1 || tx>5 || ty<1 || ty>5) continue;
        swap(a[tx][ty],a[px][py]);
		swap(px,tx);
        swap(py,ty);
        dfs(step+1);
        swap(a[tx][ty],a[px][py]);
        swap(px,tx);
        swap(py,ty);
    }
}

int main() {
    cin>>T;
    while(T--) {
    	flag=0;
    	memset(a,0,sizeof(a)); 
		for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) {
        	char l;
       		cin>>l;
       		if(l=='1') a[i][j]=1;
        	else if(l=='0') a[i][j]=0;
        	else a[i][j]=2,px=i,py=j;
    	}
    	for(len=0;len<=15;len++) {
        	dfs(1);
        	if(flag)  {
            	cout<<len<<endl;
            	break;
        	}
    	}
    	if(!flag)
        	cout<<-1<<endl;
	}
}

在我的程序里有这一句:

if(dif()>len-step+2) return ;

因为有这种特例,保险起见,多加一个1。
在这里插入图片描述

posted on   MisakaMKT  阅读(342)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)

导航

统计信息

点击右上角即可分享
微信分享提示