P2324 [SCOI2005]骑士精神(IDA*)
思路:不是动骑士,而是动空格。只能动15次,证明搜索树的高的确定的,考虑IDA解决
IDA能很好地解决一些搜索中有上界的情况
大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这个情况
所以IDA*执行的时候需要枚举一下上界。然后本题的估价函数表现为当前局面和目标相比还差了多少个步数.
每次交换最好的情况就是黑白直接对换。那样消除不同格子(2个)最快的步数也是2.也就是一个步数消除一个不同点,这是最好的情况.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
const int INF = 1e9+7;
typedef long long ll;
typedef pair<int,int> pii;
#define all(a) (a).begin(), (a).end()
#define pb(a) push_back(a)
vector<int> G[maxn];
int mp[7][7];
//0是白子,1是黑子,2个空格
int ans[7][7]={{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},
{0,0,0,0,0,0}
};
int n =5;
int flag = -1;
int func(){int dif = 0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) dif+=(mp[i][j]!=ans[i][j]);}return dif;
}
int dx[] = {1,1,-1,-1,2,2,-2,-2},dy[] = {2,-2,2,-2,1,-1,1,-1};
int mx;
void dfs(int cur,int x,int y){if(flag!=-1) return ;if(cur>mx) return ;if(cur==mx){if(!func()) flag = cur;return; }for(int i=0;i<8;i++){int nx = x+dx[i];int ny = y + dy[i];if(nx<=0||nx>n||ny<=0||ny>n) continue;swap(mp[nx][ny],mp[x][y]);if(func()+cur<=mx) dfs(cur+1,nx,ny);swap(mp[nx][ny],mp[x][y]); }
}
//
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--){int x,y;for(int i=1;i<=n;i++){string s;cin>>s;for(int j=1;j<=n;j++){if(s[j-1]!='*') mp[i][j] = s[j-1] - '0';else mp[i][j] = 2,x = i,y = j;}}flag = -1;for(mx = 0;mx<=15;mx++){dfs(0,x,y);if(flag!=-1) break;}cout<<flag<<"\n";}
}
P2324 [SCOI2005]骑士精神(IDA*)相关推荐
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 【题解】P2324[SCOI2005] 骑士精神
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位. 在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- 洛谷 P2324 [SCOI2005]骑士精神
目录 题目 思路 $Code$ 题目 戳 思路 $dfs$. $Code$ #include<iostream> #include<cstdio> #include<cs ...
- P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)
传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...
- luoguP2324 [SCOI2005]骑士精神 IDA*
题面 这个题比较简单 直接枚举搜索深度 估价函数为当前棋盘与目标棋盘不同的棋的个数 然后直接迭代加深搜索就可以了 当然还不能走回头路 Codes #include<bits/stdc++.h&g ...
- bzoj 1085: [SCOI2005]骑士精神(IDA*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2296 Solved: 1328 [Submit][St ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- bzoj1085: [SCOI2005]骑士精神(a*)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2555 Solved: 1472 [Submit][St ...
最新文章
- 43request对象 续
- IndexedQueueT——C#中的自定义队列
- Dart基础第6篇:集合类型List Set Map详解 以及循环语句 forEach map where any every
- 织云Lite发布:详解包管理核心能力
- LOJ6031 「雅礼集训 2017 Day1」字符串 SAM、根号分治
- Axure 9.0激活码亲测可用
- 半导体PN结的工作原理
- ce修改植物大战僵尸之修改阳光值
- MIKE 21 教程 2.5 水动力模块教学:涡粘系数(Eddy viscosity),河床阻力与曼宁系数(Bed Resistance)
- 区块链经济:机构加密经济学的初学者指南
- 【Linux】创建、修改和删除用户组(groupadd | groupmod | groupdel)
- 响应式 - 创建自适应的响应式字体
- 静态文档,动态文档和活动文档
- 计算机组成原理第七章笔记---输入输出
- 安卓 微信公众号 默认不操作拦截回退失败
- 查询linux下有多少用户,Linux 查看系统现存所有用户命令
- 今日金融词汇--- 高杠杆模式
- Qt ECG Monitor Qt嵌入式床旁心电监护仪项目源码
- 使用 FSL 和 TrackVis 分析 DTI 数据
- 滴滴给自己留了后手。。。