题解 P1379 【八数码难题】
2024-08-31 16:25:12
用STL中的queue,map,string写了个广搜,用一个string保存状态(见代码)注:STL比较慢,可以做一些优化(或者开O2)
#include<iostream> #include<cstdio> #include<string> #include<queue> #include<map> using namespace std; string start; map<string,long long>m;//保存这个状态需要几步到达 map<string,bool>b;//判重,记录状态是否经过 queue<string>q;//队列 int main() { cin>>start; q.push(start); b[start]=;
m[start]=;//处理初始状态
while(!q.empty())
{
string cnt=q.front();q.pop();//取队首
if(cnt=="")break;//目标状态(终止条件)
string s2="";
int position=cnt.find(s2,);//查找0的位置
string s3=cnt;//见下文
if(position->=)
{
swap(s3[position],s3[position-]);/*骚操作,可以交换string中两个位置的值(知道s3干什么的了吧……)*/
if(!b[s3])
{
m[s3]=m[cnt]+;
q.push(s3);
b[s3]=;
}//入队
s3=cnt;//别忘了改回来
}//往上跑
if(position->=&&(position)%!=)/*往左跑,注意判越界*/
{
swap(s3[position],s3[position-]);
if(!b[s3])
{
m[s3]=m[cnt]+;
q.push(s3);
b[s3]=;
}
s3=cnt;
}
if(position+<cnt.size()&&(position+)%!=)//往右跑
{
swap(s3[position],s3[position+]);
if(!b[s3])
{
m[s3]=m[cnt]+;
q.push(s3);
b[s3]=;
}
s3=cnt;
}
if(position+<cnt.size())//往下跑
{
swap(s3[position],s3[position+]);
if(!b[s3])
{
m[s3]=m[cnt]+;
q.push(s3);
b[s3]=;
}
s3=cnt;
}
}
printf("%d",m[""]);//因为保证有解,所以直接输出答案。
}
最新文章
- Matlab 读取文件夹中所有的bmp文件
- 结构体struts的长度
- gridview里日期显示格式
- JS-009-屏幕分辨率、浏览器显示区域、元素位置获取
- linux下启动dbca或netmgr类的图形界面报错解决
- 【POJ3580】【块状链表】SuperMemo
- ZJUT 1423 地下迷宫(期望DP&;高斯消元)
- oracle_解锁表_解锁用户
- 九、oracle 事务
- [Leetcode] Binary search -- 475. Heaters
- ArcGIS Earth(原谷歌地球)如何获取高精度矢量地图数据?(shp文件/要素类/kml)
- 解决在使用gensim.models.word2vec.LineSentence加载语料库时报错 UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte......的问题
- weblogic/tomcat Get乱码【转】
- selenium是如何启动浏览器的
- php之memcached存储session配置、存储、获取
- ubuntu系统中Qt creator 编辑和应用使用中文输入法
- [Windows Azure] Create a Virtual Network for Site-to-Site Cross-Premises Connectivity
- 原生JavaScript的DOM操作方法总结
- No.1011_第八次团队会议
- C#基础笔记(第十六天)