【广搜】棋盘游戏

题目描述

在一个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;将函数体代码和相应的实参直接在函…

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

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

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

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

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

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

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本身的…

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…

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…

安装win_server_2012的方法

1、从微软官网下载评估版。 2、查看你的当前版本。以管理员身份运行cmd&#xff0c;然后输入“DISM /online /Get-CurrentEdition”。如果是评估版&#xff0c;例如Standard&#xff0c;把“ServerStandardEval”中的Eval这四个字母去掉&#xff0c;就是你的当前版本。下图表明…

DHCP中继处理办法

这两天一直在客户这边测试DHCP&#xff0c;由于客户的网络是现成的server 2008 是后来加上去的&#xff0c;所以没有多的IP地址用于测试&#xff0c;只好拿客户的楼层网段来测试&#xff0c;由于需要跨VLAN实行DHCP地址分配&#xff0c;所有需要做DHCP中继。废话不多说&#xf…

C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数

1、默认构造函数 没有参数&#xff1b;若有参数&#xff0c;则一定全部都有默认的参数值。 2、初始化列表 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特性 建议用初始化列表来初始化数据成员。初始化列表先于构造函数执行&#xff1b;初始化列表只能用于构造函…

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

一、为什么需要析构函数&#xff1f; 见博客&#xff1a;http://blog.csdn.net/zhhymh/article/details/6239832 二、析构函数的理解 1、格式 2、必要性 释放资源。 3、什么时候调用&#xff1f; delet p时会调用析构函数&#xff1b;程序返回时&#xff0c;也会调用析构函数…

生成的数据库脚本没有注释?

1,选择Database->Generate Database 选中Generate name in empty comment就可以了转载于:https://www.cnblogs.com/hongjiumu/archive/2012/08/02/2620379.html

HDU 1312

View Code 1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 以前用BFS写过&#xff0c;这次改用DFS写发现DFS掌握的不好&#xff0c;挑了好久才过&#xff0c;今下午才AC了两道题&#xff0c;还要加紧练习DFS&#xff01;5 int row,col,coun…

C++远征之封装篇——对象数组,对象成员

一、对象数组 &#xff08;1&#xff09;如下&#xff0c;delet [ ]p时&#xff0c;会调用三次析构函数 &#xff08;2&#xff09;细节 实例化对象数组时&#xff0c;每一个对象的构造函数都会被执行。销毁对象数组时&#xff0c;每一个对象的析构函数都会被执行。 二、对象成…

ehcache memcache redis 三大缓存男高音

2019独角兽企业重金招聘Python工程师标准>>> 最近项目组有用到这三个缓存&#xff0c;去各自的官方看了下,觉得还真的各有千秋&#xff01;今天特意归纳下各个缓存的优缺点&#xff0c;仅供参考&#xff01; Ehcache 在java项目广泛的使用。它是一个开源的、设计于…

C++远航之封装篇——深拷贝、浅拷贝

1、浅拷贝 如下&#xff0c;此时如果同一块内存释放两次&#xff0c;会报错 2、深拷贝