【广搜】棋盘游戏

题目描述

在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。
Klux说:“这么简单的题目,我都会做!”

输入

第1到4行每行四个数字(1或者0),描述了初始棋盘。
接着是一个空行。
第6到9行每行四个数字,描述了最终棋盘。

 

输出

第一行是一个整数n,表示最少的移动步数。
接下来n行每行4个数,r1,c1,r2,c2,表示移动的两个棋子的坐标(r1,c1),(r2,c2)(棋盘左上角的坐标为(1,1),并且他右边的格子为(1,2))
如果有许多组解,你可以输出任意一组。

 

样例输入

1111
0000
1110
00101010
0101
1010
0101

样例输出

4
1 2 2 2
1 4 2 4
3 2 4 2
4 3 4 4




【题意】

  交换即可,但是大家要这个状态不好标记处理,所以我们需要hash处理,这个01矩阵,不难想到我们处理成二进制来处理。

  我们怎么处理这个题目中1,0对应的位置呢???我们可以用我们二维数组通用的hash方法,就是除以列宽得行号,对列宽取余得到列号的做法。

  ”交换“:如何实现??

  同样地得到上下两个坐标的位置,同时其实他们对应的二进制也是序号来记录的,然后我们直接找到两个位置,用异或处理就可以交换0和1的操作。

  怎么打印这个答案呢??

  我认为这个题目还有一点就是记录路径的方法,记录路径是非常考验人的,但是我们需要开一个结构体,

  这个结构体需要记录这次hash值对应的哪两个坐标进行交换了,同时这个结构体能通过最终状态的hash值回溯输出。

【代码】:

  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = (1<<16)+10;
 4 int pre[N],vis[N];
 5 typedef struct Node {
 6     int x,y,px,py ;
 7     int pre_Num ;
 8 }Node ;
 9 Node ans[N];
10 int n,m;
11 void dfs(int No){
12     if( ans[No].pre_Num != n )
13         dfs(ans[No].pre_Num);
14     printf("%d %d %d %d\n",ans[No].x,ans[No].y,ans[No].px,ans[No].py);
15 }
16 void BFS(){
17     queue < int > Q ;
18     Q.push ( n );
19     while ( !Q.empty() ) {
20         int cur = Q.front();
21         Q.pop();
22         // 上下互换
23         for(int i=0;i<=11;i++){
24             int u = ( cur & (1<<i) ) >> i ;
25             int v = ( cur & (1<<i+4) ) >> (i+4);
26             int tmp = ( 1<<(i+4) ) + (1<<i) ;
27             if ( u != v ){
28                 int next = cur ^ tmp ;
29                 if( vis[next] == 0 ){
30                     ans[next].x = i / 4 + 1 ;
31                     ans[next].px = ans[next].x + 1 ;
32                     ans[next].y = ans[next].py = i % 4 + 1 ;
33                     ans[next].pre_Num = cur ;
34                     vis[next] = vis[cur] + 1 ;
35                     Q.push(next);
36                     if ( next == m ){
37                         printf("%d\n",vis[m]);
38                         dfs(next);
39                         return ;
40                     }
41                 }
42             }
43         }
44         // 左右互换
45         for(int i=0;i<=15;i++){
46             if(i%4==3) continue ;
47             int u = ( cur & (1<<i) ) >> i ;
48             int v = ( cur & (1<<(i+1)) ) >> (i+1);
49             int tmp = ( 1<<(i+1) ) + (1<<i) ;
50             if ( u != v ){
51                 int next = cur ^ tmp ;
52                 if( vis[next] == 0 ){
53                     ans[next].px = ans[next].x = i / 4 + 1 ;
54                     ans[next].y =  i % 4 + 1 ;
55                     ans[next].py = i % 4 + 2 ;
56                     ans[next].pre_Num = cur ;
57                     vis[next] = vis[cur] + 1 ;
58                     Q.push(next);
59                     if ( next == m ){
60                         printf("%d\n",vis[m]);
61                         dfs(next);
62                         return ;
63                     }
64                 }
65             }
66         }
67     }
68 }
69 int main()
70 {
71     for(int i=0,x;i<16;i++){
72         scanf("%1d",&x);
73         n += x * (1<<i);
74     }
75     for(int i=0,x;i<16;i++){
76         scanf("%1d",&x);
77         m += x * (1<<i);
78     }
79     if ( n==m ){
80         return 0*puts("0");
81     }else{
82         BFS();
83     }
84     return 0;
85 }
86 
87 /*
88 
89 1111
90 0000
91 1110
92 0010
93 
94 1010
95 0101
96 1010
97 0101
98 
99 */
棋盘游戏

 

转载于:https://www.cnblogs.com/Osea/p/11215746.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++离航篇——函数默认参数、函数重载、内敛函数

1、函数的默认参数 2、函数的重载 &#xff08;1&#xff09;在相同的作用域内&#xff0c;用同一个函数名定义的多个函数&#xff0c;其中每个函数的参数个数、参数类型不同。 3、内联函数 &#xff08;1&#xff09;编译的时候&#xff0c;将函数体代码和相应的实参直接在函…

POJ——字符串插入

欢迎来我的个人网站&#xff1a;http://www.rxwcv.cn 2:字符串插入 查看提交统计提问总时间限制: 1000ms 内存限制: 65536kB描述有两个字符串str和substr&#xff0c;str的字符个数不超过10&#xff0c;substr的字符个数为3。&#xff08;字符个数不包括字符串结尾处的\0。&…

POJ 1200 Crazy Search(RK)

题意 给定一个由NC个字母组成的字符串&#xff0c;求长度为N的不同子串的个数 思路&#xff1a; 由于只有NC个字母&#xff0c;可以将字母编号&#xff0c;0 &#xff5e; NC - 1&#xff0c;转换成数字&#xff0c;就可以将字符串表示成NC进制的数字&#xff0c;这样所有字串代…

C++离航篇——内存的申请释放

1、内存的申请和释放 使用关键字new&#xff0c;紧接申请的类型&#xff0c;以及用中括号标明申请多大的内存空间。 2、内存的初始化 注意和块内存申请不同&#xff0c;初始化是&#xff08;&#xff09;&#xff0c;块内存是[ ]。

去掉ExpandableListView的箭头图标

用到ExpandableListView时有个箭头图标系统自带的在你自定义布局也不能去掉只要设置一个属性即可&#xff0c;如下&#xff1a; settingLists.setGroupIndicator(null); ~~~~~~~~~~~~~~~~~此处就是设置自定义的箭头图标的。置空则没有了。 也可以自定义&#xff08;但是位置还…

C++远征之封装篇——类和封装、实例化和对象成员访问

一、封装篇的学习内容数据成员 成员函数构造函数 析构函数对象复制 对象赋值对象数组 对象指针this指针二、类与封装三、实例化和对象成员访问&#xff08;1&#xff09;从栈中实例化对象&#xff08;2&#xff09;从堆中实例化对象 &#xff08;3&#xff09;对象成员的访…

[原创]Enterprise Architecture V7.5 C++代码生成时,头文件中函数声明没有注释,CPP中函数定义却有注释。...

这几天一直在用Enterprise Architecture来抽象项目中要用到的一些数据结构和类&#xff0c;然后都做得差不多了之后发现&#xff0c;生成代码的时候.h文件中类成员函数部分没有注释&#xff0c;但是.cpp文件中的函数定义块却有注释&#xff0c;我觉得重点应该是要在头文件的成员…

ios之mknetworkkit笔记

asi没法用了&#xff0c;蛋疼了&#xff0c;在af和mk之间纠结&#xff0c;感觉af不适合我的口味&#xff0c;解析和网络耦合相对似乎重了点 mk似乎默认的不支持下载的断点续传&#xff0c;这里参考网上的代码处理了下&#xff0c;0修改mk的库&#xff0c;下面是实现的代码 // /…

C++远征之封装篇——字符串类型

一、c中的字符串操作函数 二、字符串类型string 1、c中没有字符串类型&#xff0c;只有字符类型 因此对于字符串的操作&#xff0c;一般是用上面的函数来操作。 2、字符串的初始化 3、字符串相关的操作

无需格式转换直接发布DWG图纸到Autodesk Infrastructure Map Server(AIMS) 2013

无需格式转换直接发布DWG图纸到AIMS供Web用户浏览估计是AIMS2013里最激动人心的新功能了&#xff0c;看一下这个视频吧。 英文版&#xff1a; http://docs.autodesk.com/MAP/2013/ENU/map_videos_new_features/Publishing%20DWG%20files.html 中文版&#xff1a; http://docs.a…

分词相关技术(转载)

最近在做问答系统&#xff0c;自己在园子里面找了下资料&#xff0c;觉得不错&#xff0c;自己是菜鸟原创不行&#xff0c;废话不多说了&#xff0c;送上资料。 第一个是关于Lucene的分词技术 这里可以下载PDF看&#xff0c;Lucene 原理与代码分析完整版 目录如下&#xff1a;…

C++远航之封装篇——数据的封装

以对象为中心&#xff0c;具体来说&#xff0c;以谁做什么来代表程序的逻辑。所有操作都通过调用自己的函数来完成。 数据成员暴露了&#xff0c;不好的设计&#xff1a; 数据的封装&#xff1a;

游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2

老少爷们儿反击战 上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了&#xff0c;少爷们可以和女仆酱一起参加下午茶~ 难得的上流社会啊 这是永远1v1被人私有的女奴 和 喝茶时被人共有的女仆酱最明显的差异~ 明媚的午后阳光下&#xff0c;庭院里白色长餐桌两旁&am…

【转载】App.config/Web.config 中特殊字符的处理

写一个网站&#xff0c;遇到一个问题&#xff0c;发布以后&#xff0c;提示错误&#xff0c;但是即使打开错误提示&#xff08;在web.config中打开&#xff09;&#xff0c;还是只提示错误&#xff0c;没提示什么地方错误&#xff0c;这让我知道了&#xff1a;是webconfig本身的…

Windows 8 C++/CX字符串

在C/CX里面是使用Platform::String类来表示字符串的类型&#xff0c;在windows运行时的接口和方法中&#xff0c;需要使用Platform::String来作为字符串参数的传递。如果需要使用标准C的字符串类型如wstring或者string的时候&#xff0c;可以将Platform::String与标准的C的字符…

C++远航之封装篇——类外定义和::

1、类内定义是把函数的具体实现写在类内部&#xff0c;默认是inline函数。 2、类外定义包含两种情况&#xff1a; &#xff08;1&#xff09;同文件类外定义 &#xff08;2&#xff09;不同文件类外定义

pipeline代码自动生成

如图所示&#xff0c;安装完插件后&#xff0c;Sample Step里就有相应的选项&#xff0c;选择某个选项后&#xff0c;点击Generate Pipeline Script按钮&#xff0c;就可以自动生成代码片段&#xff0c;然后放入pipeline流水线里就可以了 pipeline使用的是groovy脚本&#xff0…

一个简单的基于socket的通讯处理程序

2019独角兽企业重金招聘Python工程师标准>>> 这几天看书看得java网络编程&#xff0c;看到一个不错的&#xff0c;适合新手的&#xff0c;部分代码借鉴书上的&#xff0c;可能有地方还不是很成熟&#xff0c;不过可以借鉴一下&#xff0c;分为客户端和服务端&#x…

OncePerRequestFilter的作用

在Spring中&#xff0c;filter默认继承OncePerRequestFilter&#xff0c; OncePerRequestFilter源代码如下&#xff1a; /** Copyright 2002-2008 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not…

C++远航之封装篇——构造函数

1、为什么需要构造函数&#xff1f; 见博客http://blog.csdn.net/zhhymh/article/details/6236317 2、c中的内存分区 &#xff08;1&#xff09;栈区 int x0&#xff1b;int *pNULL&#xff1b; &#xff08;2&#xff09;堆区 int *p new int[20]; &#xff08;3&#xff0…