codevs1225八数码难题(搜索·)
Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.
问题描述
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
输入初试状态,一行九个数字,空格用0表示
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
283104765
4
详见试题
#include<iostream>
#include<cstdio>
#define N 500000
using namespace std;
struct node
{
int mp[][];
}a[N];
int g[][]={{,,,},{,,,},{,,,},{,,,}};
int xx[] = {,,,-};
int yy[] = {,-,,};
int hash[];
int step[N];
int h,t=,flag;
int check()
{
for (int i=;i<=;i++)
for (int j=;j<=;j++)
if (a[t].mp[i][j] != g[i][j])
return ;
return ;
}
int Hash()
{
int s = ,k = ;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
s += a[t].mp[i][j]*k,k*=;
s %= ;
if (!hash[s]) {hash[s] = ;return ;}
return ;
}
int pd(int x,int y)
{
if (x && x<= && y && y<=) return ;
return ;
}
void move(int x,int y)
{
for (int i=;i<;i++)
{
int p = x+xx[i], q = y+yy[i];
if (pd(p,q))
{
for (int j=;j<=;j++)
for (int k=;k<=;k++)
a[t].mp[j][k] = a[h].mp[j][k];
swap(a[t].mp[x][y],a[t].mp[p][q]);
step[t] = step[h] +;
if (check()) {cout<<step[t]; flag = ;return;}
if (Hash()) t++;
}
}
}
void search()
{
while (h<t)
{
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{
if (a[h].mp[i][j] == )
move(i,j);
if (flag) return;
}
h++;
}
}
int main()
{
string str;
cin>>str;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
a[].mp[i][j] = str[(i-)*+j-]-'';
search();
}
dfs
#include<bits/stdc++.h>
using namespace std;
int matrix[][]={{,,,},{,,,},{,,,},{,,,}};
int dx[]={,,,-};int dy[]={,,-,};int st[][],dep,step;
bool flag=false; int check()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(st[i][j]!=matrix[i][j])return false;
return true;
} int jdg(int sx,int sy,int x,int y)
{
if(sx==x&&sy==y)return false;
if(sx>&&sy>)
if(sx<=&&sy<=)
return true;
return false;
} void search(int x,int y,int fx,int fy)
{
if(check()){flag=true;return ;}
if(step==dep)return ;
for(int i=;i<=;i++)
{
int sx=x+dx[i];
int sy=y+dy[i];
if(jdg(sx,sy,fx,fy))
{
swap(st[x][y],st[sx][sy]);
step++;
search(sx,sy,x,y);
step--;
swap(st[x][y],st[sx][sy]);
}
}
} int main()
{
int si,sj;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
scanf("%c",&st[i][j]);
st[i][j]-='';
if(st[i][j]==)si=i,sj=j;
}
for(dep=;;dep++)
{
search(si,sj,,);
if(flag)
{
cout<<dep;return ;
}
}
return ;
}
codevs1225八数码难题(搜索·)的更多相关文章
- codevs1225 八数码难题
题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在 3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数 ...
- 【基础练习】【BFS+A*】codevs1225八数码难题题解
题目描写叙述 Description Yours和zero在研究A*启示式算法.拿到一道经典的A*问题,可是他们不会做,请你帮他们. 问题描写叙述 在3×3的棋盘上,摆有八个棋子,每一个棋子上标有1至 ...
- 【P1379】八数码难题(搜索+暴力)
这个题真是... 不想说什么了,及其复杂和烦人的一道题.基础思路就是bfs,用两个队列分别进行0的位置的计算和每一步的状态..然而这个题最重要的一点在于判重,实际上可以康托展开用全排列的个数进行判重, ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- Codevs 1225 八数码难题
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
随机推荐
- CQOI2007 涂色 paint (区间dp)
听说这道题是当年省选题 于是兴致勃勃拿来做了做 至于如何想到思路... 事实上没想象中那么简单... 脑阔挺疼的... (一开始都没看出来是区间dp) 想到可以区间dp,然后就似乎没啥大问题 枚举区间 ...
- Linux终端中的字符串使用总结(截取,切片,查找替换,转换,变量赋值等)
1.基于模式匹配截取字符串 1.#.##号截取 #号截取,从左边开始,以一个出现的分隔符(最左)为准,删除左边字符. ##号截取,从左边开始,以最后(最右)一个分隔符为准,删除左边字符. str='h ...
- WordCountPro,完结撒花
WordCountPro,完结撒花 软测第四周作业 一.概述 该项目github地址如下: https://github.com/YuQiao0303/WordCountPro 该项目需求如下: ht ...
- BNUOJ 13358 Binary Apple Tree
Binary Apple Tree Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Orig ...
- Codeforces Round #226 (Div. 2) C题
数论好题 题目要求:求给定序列的素因子如果在给定区间内该数字个数加1; 思路:打表时求出包含给素数因子的数的个数,详见代码 1 #include<cstring> +; scan ...
- Codeforces Round #232 (Div. 2) On Sum of Fractions
Let's assume that v(n) is the largest prime number, that does not exceed n; u(n) is the smallest pri ...
- [K/3Cloud] K/3 Cloud1.0怎样和2.0共存在一台服务器上
第一步:安装Cloud1.0,创建管理中心,创建业务数据中心,备份管理数据库和业务数据库,并且备份安装目录: 第二步:卸载Cloud1.0,清理安装目录,安装Cloud2.0,创建管理中心,创建业务数 ...
- 过河(codevs 1155)
题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥 ...
- 网线切割&切绳子
题目描述 Wonderland居民决定举行一届地区性程序设计大赛.仲裁委员会志愿负责这次赛事并且保证会组织一次有史以来最公正的比赛.为此,所有参赛者的电脑和网络中心会以星状网络连接,也就是说,对每个参 ...
- 二叉堆练习3&【模板】堆
时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 Inp ...