`
godfrey90
  • 浏览: 56087 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

poj1753解题报告

阅读更多
1.算法
核心是宽度优先搜索和位处理。要找出最快的步数,用宽搜。
(1)宽度优先搜索数据结构:
队列的单元unit包含x(用int的末16位记录16个位置的信息),rounds(记录第几轮达到当前的状态),i(记录该状态是通过翻动哪个棋子得来的,以避免返回先前的状态)。queue是一个队列,记录所有状态;p,q分别是队列的头尾指针。used记录已经存在的状态。
(2)宽度优先搜索算法处理:
a.首先是读入数据。
b.进行宽度搜索,直到找到结果,或者队列中没有元素(此时为impossible)。
c.flip函数是从a状态通过翻动第i个棋子到达b状态。
d.在得到一个新状态的时候要检验之前时候存在这个状态,如果存在就把这个状态舍弃,即q--;
2.实现
(1)阅读代码的时候,不能scanf("%c")读取到每一个字符,因为读取字符的时候会读到"\n",或许还会有其他的字符。通过读取string能够解决这个问题。
(2)通过位操作可以a.减少内存b.可以对16位单独操作,也可以对整体进行操作。
(3)在查找某状态是否与之前状态有重叠时可以通过数组下标进行操作,这样速度较快。
(4)获取一个int某位用该int与(0X1<<i)进行&操作。
   将一个int的某位置1用该int与(0X1<<i)进行|操作。
   将一个int的某位置反用该int与(0X1<<i)进行^操作。
3. 代码
#include<cstdio>

struct unit {
int x;
int rounds;
int i;
};

void flip(unit a, int n, unit& b);

int main() {
/*queue*/
unit queue[100000];
queue[0].x = 0;
queue[0].i = -1;
queue[0].rounds = 0;
int p = 0, q = 0;
//judge used
bool used[100000]={false};
/*read in*/
char str[10];
for (int i = 0; i < 4; i++) {
scanf("%s", str);
for (int j = 0; j < 4; j++) {
if (str[j] == 'b') {
queue[0].x = ((0X1 << (i * 4 + j)) | (queue[0].x));
}
}
}
/*search*/

while (!((queue[q].x == 0) || (queue[q].x == 0XFFFF))) {
for (int i = 0; i < 16; i++) {
if(queue[p].i==i) continue;
q++;
flip(queue[p], i, queue[q]);
if (used[queue[q].x])q--;
used[queue[q].x]=true;
if ((queue[q].x == 0) || (queue[q].x == 0XFFFF))
break;
}

if (p == q) {
printf("Impossible");
break;
}

p++;
}
if ((queue[q].x == 0) || (queue[q].x == 0XFFFF))
printf("%d\n", queue[q].rounds);
return 0;
}
void flip(unit a, int n, unit& b) {
int x = n / 4, y = n % 4;
b.x = a.x;
b.x = ((b.x) ^ (0X1 << (n)));
if (x > 0)
b.x = ((b.x) ^ (0X1 << (n - 4)));
if (x < 3)
b.x = ((b.x) ^ (0X1 << (n + 4)));
if (y > 0)
b.x = ((b.x) ^ (0X1 << (n - 1)));
if (y < 3)
b.x = ((b.x) ^ (0X1 << (n + 1)));
b.rounds = a.rounds + 1;
b.i = n;
}
分享到:
评论

相关推荐

    poj 3414解题报告

    poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告

    poj 1012解题报告

    poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告

    poj 2329解题报告

    poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告

    poj 1440解题报告

    poj 1440解题报告 poj 1440解题报告 poj 1440解题报告 poj 1440解题报告

    poj 3083解题报告

    poj 3083解题报告poj 3083解题报告poj 3083解题报告poj 3083解题报告

    poj 1659解题报告

    poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告

    POJ1753.rar_poj 1753_poj1753

    【描述】"POJ1753 Flip Game题目完整代码及报告" 暗示这个压缩包包含了对POJ1753问题的解答,不仅有代码实现,还有可能涉及问题分析、解题思路以及运行结果的详细报告。通常,这类资源对于学习和理解特定编程问题的...

    poj 3720解题报告

    poj 3720解题报告poj 3720解题报告poj 3720解题报告poj 3720解题报告

    北大poj解题报告

    这个“北大poj解题报告”包含了作者在使用POJ平台解题过程中的学习总结和经验分享,旨在帮助软件工程专业的学生提升编程能力和算法理解。 解题报告通常会涵盖以下几个方面: 1. **基础算法讲解**:解题报告中可能...

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...

    POJ1753-Flip Game

    《翻转游戏——POJ1753解题分析与实现》 在计算机科学与编程领域,解决问题的能力是至关重要的。北京大学在线编程平台POJ(Problemset Online Judge)中的题目POJ1753——“Flip Game”,就是一个很好的锻炼逻辑...

    poj1691解题报告

    ### poj1691解题报告 #### 题目信息 - **题目名称**:Painting A Board - **时间限制**:1S - **内存限制**:1000K - **提交总数**:62 - **通过总数**:35 - **来源**:...

    acm竞赛----北大poj详细解题报告

    【ACM竞赛与北大POJ解题报告】 在编程竞赛领域,ACM(国际大学生程序设计竞赛,简称ACM/ICPC)是一项极具影响力的比赛,它挑战参赛者的算法设计、问题理解和快速编码能力。北京大学(Peking University)的在线判题...

    80道POJ解题报告

    【标题】"80道POJ解题报告"所涉及的知识点主要集中在ACM(国际大学生程序设计竞赛)和POJ(编程Online Judge系统)上。POJ是北京大学主办的一个在线编程竞赛平台,广泛用于训练和提升程序员的算法设计与实现能力。80...

    北大ACM_POJ_解题报告

    【北大ACM_POJ_解题报告】是北京大学ACM在线评测系统POJ的解题资源集合,这个压缩包包含了对POJ平台上的各种类型ACM竞赛题目的详细解答。ACM,全称国际大学生程序设计竞赛(International Collegiate Programming ...

    POJ 1316解题报告

    【POJ 1316 解题报告】 本题源自北京大学举办的ACM竞赛,题号为POJ 1316,主要涉及算法设计和数组的应用。题目要求找到10000以内的所有self-number,并输出它们。Self-number是一个特殊的整数序列,它的定义是该数...

    poj 2392 解题报告

    《POJ 2392解题报告:高效计算最高堆积高度》 本文将深入解析POJ 2392这个编程题目,该题目要求利用给定的不同高度、耐压性和数量的block,来确定能够堆叠出的最大高度。解决这个问题的关键在于运用排序和动态规划...

    poj2828解题报告

    这篇解题报告主要介绍了如何解决POJ2828这个编程题目。该题目涉及的数据结构是区间树(Interval Tree),这是一种用于高效处理区间查询和修改的树形数据结构。在这个问题中,我们需要根据输入的元素位置和值,构建一...

    ACM Poj Pku 解题报告答案 打包 下载 600多题 史上最全

    ACM Poj Pku 解题报告答案 打包 下载 600多题 史上最全 不是网上乱传的200多题,更不是100多题就挂着10分才能下的题 下了这个 大家也不要浪费分数去下载其它版本的了,基本上都有 共享 一起进步 中国加油 ACMer...

    本人整理的POJ解题报告大全

    【POJ解题报告大全】是我精心整理的一份编程题解集合,主要涵盖了在Programming Online Judge(POJ)平台上遇到的250道经典题目。POJ是一个著名的在线编程竞赛平台,它为程序员提供了大量的算法练习题目,是提高编程...

Global site tag (gtag.js) - Google Analytics