第一次用位运算和十六进制数_poj1753

[size=large][url]http://poj.org/problem?id=1753[/url][/size]
[size=medium][b](1)题意:一个4*4的棋盘,上面放着棋子,棋子要么白色朝上,要么黑色朝上。每一次翻动棋子有两个规则:①只能是16个中的一个。②翻动一个棋子,那么它的上下左右也都要翻动(存在的话)。要求输出使棋盘全为黑或全为白的最少翻动次数。
(2)思想:①搜索方法是用BFS。②翻动棋子采用的是异或运算,所以程序定义了一个int数组。为了表示方便int数组中的数采用十六进制数表示。
(3)Java实现:[/b][/size]


package id0000_1999;

import java.util.ArrayDeque;
import java.util.Scanner;

/**
* 3768K 2985MS ac
*/
public class Id1753 {
//最后两个是棋盘上棋子全黑或着全白的表示。
static int[] op = new int[] { 0x0000c800, 0x0000e400, 0x00007200,
0x00003100, 0x00008c80, 0x00004e40, 0x00002720, 0x00001310,
0x000008c8, 0x000004e4, 0x00000272, 0x00000131, 0x0000008c,
0x0000004e, 0x00000027, 0x00000013, 0x0000ffff, 0x00000000 };

public static void main(String[] args) {

char[] arr;
int chess = 0, count = 0;
Scanner sc = new Scanner(System.in);
while (count < 4) {
arr = sc.nextLine().toCharArray();
for (int i = 0; i < 4; i++) {
chess <<= 1;
if (arr[i] == 'b')
chess++;
}
count++;
}
if (chess == op[16] || chess == op[17]) {
System.out.println(0);
return;
}
arr = null;
sc = null;// 没用的变量名设为null,不知道这样能不能省内存.
count = 0;
Node n;
ArrayDeque<Node> queue = new ArrayDeque<Node>();
while (count < 16) {
int temp = chess ^ op[count];
if (temp == op[16] || temp == op[17]) {
System.out.println(1);
return;
}
n = new Node(count, 1, temp);
//第十六个棋子翻动后诺不能满足要求则不用加到队列中,节约内存。
if (count != 15) {
queue.add(n);
}
count++;
}
while (queue.size() != 0) {
n = queue.pollFirst();
int state = n.state;
int num = n.num + 1;
int step = n.step + 1;
while (num < 16) {
int temp = state ^ op[num];
if (temp == op[16] || temp == op[17]) {
System.out.println(step);
return;
} else {
if (num != 15) {
queue.add(new Node(num, step, temp));
}
}
num++;
}
}
System.out.println("Impossible");
}
}

class Node {

int num;

int step;

int state;

public Node(int num, int step, int state) {

this.num = num;
this.step = step;
this.state = state;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJ1753题目为"Flip Game",题目给出了一个4x4的棋盘,每个格子有黑色或白色,每次翻转一个格子会同时翻转它上下左右四个格子的颜色,目标是把整个棋盘都变为同一种颜色,求把棋盘变成同种颜色的最小步。 解题思路: 一般关于棋盘变色的题目,可以考虑使用搜索来解决。对于POJ1753题目,可以使用广度优先搜索(BFS)来解决。 首先,对于每个格子,定义一个状态,0表示当前格子是白色,1表示当前格子是黑色。 然后,我们可以把棋盘抽象成一个长度为16的二进制,将所有格子的状态按照从左往右,从上往下的顺序排列,就可以用一个16位的二进制表示整个棋盘的状态。例如,一个棋盘状态为: 0101 1010 0101 1010 则按照从左往右,从上往下的顺序把所有格子的状态连接起来,即可得到该棋盘的状态为"0101101001011010"。 接着,我们可以使用队列来实现广度优先搜索。首先将初始状态加入队列中,然后对于队列中的每一个状态,我们都尝试将棋盘上的每个格子翻转一次,生成一个新状态,将新状态加入队列中。对于每一个新状态,我们也需要记录它是从哪个状态翻转得到的,以便在得到最终状态时能够输出路径。 在搜索过程中,我们需要维护每个状态离初始状态的步,即将该状态转换为最终状态需要的最小步。如果我们找到了最终状态,就可以输出答案,即最小步。 代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值