当前位置: 首页 > 编程日记 > 正文

poj2965-poj2965-The Pilots Brothers' refrigerator

方法同poj1753,但用在这题就TLE了,以下是TLE版本:


ContractedBlock.gifExpandedBlockStart.gifCode
  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <string.h>
  4#define MAXSTATE 65536
  5#define MAXSIZE 16
  6#define ALLOPEN 0
  7
  8//队列结构体
  9ExpandedBlockStart.gifContractedBlock.giftypedef struct node{
 10    int data;
 11    struct node *next;
 12}
NODE;
 13ExpandedBlockStart.gifContractedBlock.giftypedef struct{
 14    NODE *front;
 15    NODE *rear;
 16}
QUEUE;
 17//全局变量
 18QUEUE queue;
 19int distance[MAXSTATE];
 20int position[MAXSTATE];
 21int parentState[MAXSTATE];
 22//入队列函数
 23void EnQueue(QUEUE *q, int d)
 24ExpandedBlockStart.gifContractedBlock.gif{
 25    NODE *newNode;
 26    newNode=(NODE *)malloc(sizeof(NODE));
 27    newNode->data=d;
 28    newNode->next=NULL;
 29    
 30ExpandedSubBlockStart.gifContractedSubBlock.gif    if(q->front!=NULL){
 31        q->rear->next=newNode;
 32        q->rear=newNode;
 33    }

 34    else
 35        q->front=q->rear=newNode;
 36}

 37//出队列函数
 38int DeQueue(QUEUE *q)
 39ExpandedBlockStart.gifContractedBlock.gif{
 40    int temp;
 41    NODE *oldNode;
 42ExpandedSubBlockStart.gifContractedSubBlock.gif    if(q->front==NULL){
 43        printf("List empty!\n");
 44        return -1;
 45    }

 46    oldNode=q->front;
 47    temp=q->front->data;
 48    q->front=q->front->next;
 49    free(oldNode);
 50    return temp;
 51}

 52//判断队列是否为空
 53ExpandedBlockStart.gifContractedBlock.gifint Empty(QUEUE *q){
 54    if(q->front==NULL)
 55        return 1;
 56    return 0;
 57}

 58
 59int ChangeState(int id, int pos)
 60ExpandedBlockStart.gifContractedBlock.gif{
 61    int t, new_id;
 62    new_id=id^1<<pos;
 63ExpandedSubBlockStart.gifContractedSubBlock.gif    if (pos>=4){
 64        t=pos-4;
 65ExpandedSubBlockStart.gifContractedSubBlock.gif        while(t>=0{
 66            new_id^=1<<t;
 67            t-=4;
 68        }

 69    }

 70ExpandedSubBlockStart.gifContractedSubBlock.gif    if(pos<=11){
 71        t=pos+4;
 72ExpandedSubBlockStart.gifContractedSubBlock.gif        while(t<=15){
 73            new_id^=1<<t;
 74            t+=4;
 75        }

 76    }

 77ExpandedSubBlockStart.gifContractedSubBlock.gif    if(pos%4>0){//向左
 78        t=pos-1;
 79ExpandedSubBlockStart.gifContractedSubBlock.gif        while(t%4!=3 && t>=0){
 80            new_id^=1<<t;
 81            --t;
 82        }

 83    }

 84ExpandedSubBlockStart.gifContractedSubBlock.gif    if(pos%4<3){//向右
 85        t=pos+1;
 86ExpandedSubBlockStart.gifContractedSubBlock.gif        while(t%4!=0){
 87            new_id^=1<<t;
 88            ++t;
 89        }

 90    }

 91    return new_id;
 92}

 93
 94void Output(int stat)
 95ExpandedBlockStart.gifContractedBlock.gif{
 96    int cur_state, len=0, i;
 97    int arr_x[MAXSIZE];
 98    int arr_y[MAXSIZE];
 99    
100    cur_state=stat;
101    printf("%d\n", distance[cur_state]);
102ExpandedSubBlockStart.gifContractedSubBlock.gif    while(distance[cur_state]!=0){
103        arr_x[len]=position[cur_state]/4+1;
104        arr_y[len++]=position[cur_state]%4+1;
105        cur_state=parentState[cur_state];
106    }

107ExpandedSubBlockStart.gifContractedSubBlock.gif    for (i=len-1;i>=0;i--){
108        printf("%d %d\n", arr_x[i], arr_y[i]);
109    }

110}

111
112void main(int argc, char *argv[])
113ExpandedBlockStart.gifContractedBlock.gif{
114    char c;
115    int cur_state=0, new_state;
116    int i=0;
117    QUEUE *q;
118    q=&queue;
119    //freopen("input.txt", "r", stdin);
120    
121ExpandedSubBlockStart.gifContractedSubBlock.gif    while(scanf("%c"&c)!=EOF){
122ExpandedSubBlockStart.gifContractedSubBlock.gif        if(c!='\n'){
123            if (c=='+') cur_state += 1<<i;
124            i++;
125        }

126    }

127    memset(distance, -1, MAXSTATE*sizeof(int));
128    
129ExpandedSubBlockStart.gifContractedSubBlock.gif    if(cur_state==ALLOPEN){
130        printf("0\n");
131        return;
132    }

133    parentState[cur_state]=-1;
134    distance[cur_state]=0;
135    position[cur_state]=-1;
136    EnQueue(q, cur_state);
137ExpandedSubBlockStart.gifContractedSubBlock.gif    while(!Empty(q)){
138        cur_state=DeQueue(q);
139ExpandedSubBlockStart.gifContractedSubBlock.gif        for (i=0;i<MAXSIZE;i++){
140            new_state=ChangeState(cur_state, i);
141ExpandedSubBlockStart.gifContractedSubBlock.gif            if (new_state==ALLOPEN){//成功
142                parentState[new_state]=cur_state;
143                position[new_state]=i;
144                distance[new_state]=distance[cur_state]+1;
145                Output(new_state);
146                return;
147            }

148ExpandedSubBlockStart.gifContractedSubBlock.gif            if (distance[new_state]==-1){//未访问过结点
149                distance[new_state]=distance[cur_state]+1;
150                position[new_state]=i;
151                parentState[new_state]=cur_state;
152                EnQueue(q, new_state);
153            }

154        }

155    }

156}

优化过程:将需要改变的状态存放在一个一维数组当中,这样就减少了每次改变状态时的开销。如下所示:

int state[MAXSIZE]={
0xF888,0xF444,0xF222,0xF111,
0x8F88,0x4F44,0x2F22,0x1F11,
0x88F8,0x44F4,0x22F2,0x11F1,

0x888F,0x444F,0x222F,0x111F};

0xF888转换为二进制是1111 1000 1000 1000,换一种格式:

1111

1000

1000

1000

表示改变坐标(0,0)的状态时第一列和第一行的状态都要改变,这样只要和当前状态XOR一下就可以得到新的状态了。

再次提交了一次任然是TLE。。。看来效果不是很明显。

继续改进,发现队列用的是链表实现,效率没有用数组高,因而将链表用数组全部重写。

再次提交,果然AC了。

Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time
4856540zen_chou2965Accepted1220K219MSC2387B2009-03-26 17:27:36

ContractedBlock.gifExpandedBlockStart.gifCode
  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <string.h>
  4#define MAXSTATE 65536
  5#define MAXSIZE 16
  6#define ALLOPEN 0
  7//循环队列结构体
  8ExpandedBlockStart.gifContractedBlock.giftypedef struct{
  9    int head, tail;
 10    int node[MAXSTATE];
 11}
QUEUE;
 12//队列函数
 13void Init(QUEUE *q)
 14ExpandedBlockStart.gifContractedBlock.gif{
 15    q->head=q->tail=0;
 16}

 17int Empty(QUEUE *q)
 18ExpandedBlockStart.gifContractedBlock.gif{
 19    if ((q->head-q->tail)==0return 1;
 20    return 0;
 21}

 22void EnQueue(QUEUE *q ,int d)
 23ExpandedBlockStart.gifContractedBlock.gif{
 24ExpandedSubBlockStart.gifContractedSubBlock.gif    if ((q->tail+1)%MAXSTATE==q->head){
 25        printf("Overflow!\n");
 26        return;
 27    }

 28    q->node[q->tail]=d;
 29    q->tail=(q->tail+1)%MAXSTATE;
 30}

 31int DeQueue(QUEUE *q)
 32ExpandedBlockStart.gifContractedBlock.gif{
 33    int d;
 34ExpandedSubBlockStart.gifContractedSubBlock.gif    if (q->head==q->tail) {
 35        printf("Underflow!\n");
 36        return -1;
 37    }

 38    d=q->node[q->head];
 39    q->head=(q->head+1)%MAXSTATE;
 40    return d;
 41}

 42//全局变量
 43int distance[MAXSTATE];
 44int position[MAXSTATE];
 45int parentState[MAXSTATE];
 46QUEUE queue;
 47ExpandedBlockStart.gifContractedBlock.gifint state[MAXSIZE]={
 480xF888,0xF444,0xF222,0xF111,
 490x8F88,0x4F44,0x2F22,0x1F11,
 500x88F8,0x44F4,0x22F2,0x11F1,
 510x888F,0x444F,0x222F,0x111F}
;
 52
 53
 54int ChangeState(int id, int pos)
 55ExpandedBlockStart.gifContractedBlock.gif{
 56    int new_id;
 57    new_id=id^state[pos];
 58    return new_id;
 59}

 60
 61void Output(int stat)
 62ExpandedBlockStart.gifContractedBlock.gif{
 63    int cur_state, len=0, i;
 64    int arr_x[MAXSIZE];
 65    int arr_y[MAXSIZE];
 66    cur_state=stat;
 67    printf("%d\n", distance[cur_state]);
 68ExpandedSubBlockStart.gifContractedSubBlock.gif    while(distance[cur_state]!=0){
 69        arr_x[len]=position[cur_state]/4+1;
 70        arr_y[len++]=position[cur_state]%4+1;
 71        cur_state=parentState[cur_state];
 72    }

 73ExpandedSubBlockStart.gifContractedSubBlock.gif    for (i=len-1;i>=0;i--){
 74        printf("%d %d\n", arr_x[i], arr_y[i]);
 75    }

 76}

 77
 78void main(int argc, char *argv[])
 79ExpandedBlockStart.gifContractedBlock.gif{
 80    char c;
 81    int cur_state=0, new_state;
 82    int i=0;
 83    QUEUE *q;
 84    q=&queue;
 85    //freopen("input.txt", "r", stdin);
 86    
 87ExpandedSubBlockStart.gifContractedSubBlock.gif    while(scanf("%c"&c)!=EOF){
 88ExpandedSubBlockStart.gifContractedSubBlock.gif        if(c!='\n'){
 89            cur_state<<=1;
 90            if (c=='+') cur_state+=1;
 91        }

 92    }

 93    memset(distance, -1, MAXSTATE*sizeof(int));
 94    
 95ExpandedSubBlockStart.gifContractedSubBlock.gif    if(cur_state==ALLOPEN){
 96        printf("0\n");
 97        return;
 98    }

 99    parentState[cur_state]=-1;
100    distance[cur_state]=0;
101    position[cur_state]=-1;
102    EnQueue(q, cur_state);
103ExpandedSubBlockStart.gifContractedSubBlock.gif    while(!Empty(q)){
104        cur_state=DeQueue(q);
105ExpandedSubBlockStart.gifContractedSubBlock.gif        for (i=0;i<MAXSIZE;i++){
106            new_state=ChangeState(cur_state, i);
107ExpandedSubBlockStart.gifContractedSubBlock.gif            if (new_state==ALLOPEN){//成功
108                parentState[new_state]=cur_state;
109                position[new_state]=i;
110                distance[new_state]=distance[cur_state]+1;
111                Output(new_state);
112                return;
113            }

114ExpandedSubBlockStart.gifContractedSubBlock.gif            if (distance[new_state]==-1){//未访问过结点
115                distance[new_state]=distance[cur_state]+1;
116                position[new_state]=i;
117                parentState[new_state]=cur_state;
118                EnQueue(q, new_state);
119            }

120        }

121    }

122}

转载于:https://www.cnblogs.com/zen_chou/archive/2009/03/26/1422148.html

相关文章:

sysctl -p详解

个人一般sysctl -p 或sysctl -a比较多使用 sysctl配置与显示在/proc/sys目录中的内核参数&#xff0e;可以用sysctl来设置或重新设置联网功能&#xff0c;如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf文件&#xff0c;即可手工或自动执行由sysctl控…

定制简单的Linux系统

定制简单的Linux系统 制作思路&#xff1a; 新加一块硬盘&#xff0c;设置两个分区&#xff0c;一个存/boot&#xff0c;一个存/&#xff0c;创建文件系统并格式化。要注意&#xff0c;现在我们家的硬盘是要可以拔下来安装到其他机器上使用的&#xff0c;否则就没有意义了。试…

UCOS同步与互斥

代码为老师教授。 /* ********************************************************************************************************* * EXAMPLE CODE * * (c) Copyright 2013; Micrium, Inc.; We…

Spring学习八

1&#xff1a; Tomcat容器四个等级&#xff1f; Container&#xff0c; Engine&#xff0c; Servlet容器&#xff0c; Context 真正管理Servlet的容器是Context容器&#xff1a;一个context对应一个web工程。 <Context path"/projectOne " docBase"D:\proje…

作业六:图像编码相关概念

7.1&#xff0e;信息量&#xff1a;信息源发出的所有消息中该消息出现概率的倒数的对数。信息熵&#xff1a;对信息源X的各符号的自信息量取统计平均。 7.6如图所示&#xff1a;哈夫曼编码最终结果为&#xff1a;X11,X201,X3000,X4001。编码效率为95%。 7.8根据公式&#xff…

linux命令find命令详解

find 查找文件 find 哪里 什么类型 什么名字 -maxdepth 最大的深度 查找目录的最大深度 find -maxdepth 1 -type d -type 找什么类型的 f file 文件 d directory 目录 -name 什么名字 -mtime 根据修改时间找出对应的文件 7 7天前 -7 7天后 find命令一般与 |xargs 一起…

一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?

01. 会写最简单的程序&#xff0c;能编译通过了&#xff0c;是一次飞跃。02. 会写C/S程序了&#xff0c;能用那些常用的控件&#xff0c;对属性事件有了解了&#xff0c;会用了&#xff0c;是一次飞跃。03. 会写B/S程序了&#xff0c;也是一次飞跃。04. 你彻底理解了分层的理念…

什么是JAVA内容仓库(Java Content Repository)(3)

开发我们的例子程序 jackrabbit已经配置好了&#xff0c;现在让我们来创建我们的示例程序。这个例子程序将调用JCR-170 API。很显然&#xff0c;我们需要做两件事情&#xff1a;一个是作为后台的对数据进行增删改查&#xff08;持久层&#xff09;&#xff0c;另一个是开发相对…

Cygwin-添加到右键菜单脚本--一键安装、卸载

平时习惯用一些linux命令来完成工作&#xff0c;在Windows上有cygwin和gitbash两个选择。这两个我都装了。 相对来说cygwin支持的功能更多一些&#xff0c;但是它没有默认绑定到右键菜单。为此&#xff0c;我想到用万能的注册表解决这个事情。网上搜索了一下&#xff0c;把我眼…

在博客园安家了

终于找到自己的网上家园了。。哈哈。。 虽然早就注册了博客园&#xff0c;不过一直都在忙。没有时间整理。以后我会把自己学到的东西慢慢的发表到网上&#xff0c;和大家交流。 也会把一些自我感觉经典的东西放在园子中&#xff0c;方便大家学习。 总之&#xff0c;我以后会加油…

***WindowsXP常用的七种方法

第一招、屏幕保护 在Windows中启用了屏幕保护之后&#xff0c;只要我们离开计算机(或者不操作计算机)的时间达到预设的时间&#xff0c;系统就会自动启动屏幕保护程序&#xff0c;而当用户移动鼠标或敲击键盘想返回正常工作状态时&#xff0c;系统就会打开一个密码确认框&#…

小程序全局状态管理,在页面中获取globalData和使用globalSetData

GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex、redux全局状态管理的解决方案&#xff0c;但是在一个完整的项目中各组件的数据一致性是必须要保证&#xff0c;因此需要开发一个能够实现小程序全局状态管理的解决方案。 设计思路 参…

谈 三层结构与MVC模式的区别

谈 三层结构与MVC模式的区别 在CSDN和园子里有朋友谈到三层与MVC的区别&#xff0c;以前也有人抛出这个问题&#xff0c;本人对来公司面试的朋友也偶乐会提这方面的问题。 那么我也来讲讲我对这两者的理解吧。 首先对这个题目&#xff0c;本身是存在问题的&#xff0c;…

学习自定义组件

React入门介绍-ReactDOM.render() 蚂蚁设计-组件 React入门-ReactDOM.render()介绍 node.js和npm的关系

如何焊接电路板

今天主要想给大家分享一下焊接电路板的经验&#xff0c;作为一个电子工程师&#xff0c;焊接电路板是一个基本活&#xff0c;要不你很多东西都要麻烦到别人&#xff0c;这样就不好了&#xff0c;而今天要分享的是如何焊接贴片&#xff0c;在焊接从多的电路板中&#xff0c;我想…

加入新e时代建站网后,我可以做什么

加入原动力建站网后&#xff0c;您便开始了自由而浪漫的原动力建站网生活。您可以&#xff1a;选择自由的时间学习&#xff0c;跟您的上级交流&#xff0c;请教&#xff1b;选择自由的时间工作&#xff1b;自由的发展&#xff0c;整个互联网任您自由发挥&#xff1b;从实践中学…

[BZOJ2502]清理雪道 有上下界网络流(最小流)

2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MBDescription 滑雪场坐落在FJ省西北部的若干座山上。从空中鸟瞰&#xff0c;滑雪场可以看作一个有向无环图&#xff0c;每条弧代表一个斜坡&#xff08;即雪道&#xff09;&#xff0c;弧的方向代表斜坡下降的方向。你的…

学习API网关遇到的名词

VPC浅谈 VPC全称“虚拟私有云”&#xff0c;是一个公共云计算资源的动态配置池。虚拟私有云在概念上类似于虚拟专用网&#xff0c;需要使用加密协议、隧道协议和其他安全程序&#xff0c;在民营企业和云服务提供商之间传输数据。一个虚拟专用网可以被用来在公共网&#xff0c;…

RXJAVA之变换操作

RXJAVA提供了以下变换操作&#xff0c;对Observable的消息进行变换操作&#xff1a; 1.window 定期将来自Observable的数据分拆成一些Observable窗口&#xff0c;然后发射这些窗口&#xff0c;而不是每次发射一项。 Observable<String> observable Observable.just(&quo…

java中xxe漏洞修复方法

java中禁止外部实体引用的设置方法不止一种&#xff0c;这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的&#xff01;最早是有朋友在群里发了如下一个pdf&#xff0c; 而当时已经是2019年1月末了&#xff0c;应该不是2018年7月份那个引起较大轰动的…

模式6--ReadWriteLock

来至《java多线程设计模式》 自己提供一个逻辑锁代替JDK的物理锁synchronized 优点&#xff1a;1.对read操作不进行共享互斥&#xff0c;可以进行多个read操作&#xff0c;提高系统性能 2.适合read》write的情况 package Sample;public final class ReadWriteLock {private int…

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 无法显示 XML 页。 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 ----------------------------------------------------------------…

JDK的安装与系统环境变量的配置

一、下载JDK 用户进入到Java SE的下载网页后&#xff0c;根据自己所用的操作系统&#xff08;Windows、Linux&#xff09;和位数&#xff08;32位、64位&#xff09;选择不同的链接进行下载。本例是在Windows系统的32位机器上开发的&#xff0c;所以下载的是jdk-8u161-windows-…

docker redis 多个实例

Docker运维笔记-Docker端口映射 - 恶性佛 - CSDN博客https://blog.csdn.net/qq_29994609/article/details/51730640 利用 Docker 在一台机器上部署多个 Redis 实例 - HeatDeath的博客 - CSDN博客https://blog.csdn.net/HeatDeath/article/details/80364340 Docker命令详解 - iV…

Dojo QuickStart 快速入门教程 (1) Why Dojo

Dojo 是一个用来构建 Web 应用的 JavaScript 工具包&#xff0c;当然是开源的。它的目标是通过提供一组特别构造的 API 和一系列辅助工具&#xff0c;使你能在较短的时间里把想法变为实现&#xff0c;同时改善你的日常 Web 开发体验。它是快速的(lightning fast)、健壮的(light…

css3-transform

转载于:https://www.cnblogs.com/cyany/p/7594143.html

C#操作注册表

using Microsoft.Win32 ;以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作 1.读取指定名称的注册表的值 private string GetRegistData(string name) { string registData; RegistryKey hkml Registry.LocalMachine; RegistryKey software hkml.OpenSubKey…

Red Hat Linux 安装教程

一、下载链接 链接&#xff1a;https://pan.baidu.com/s/1JShQmOrgGG5_uaqPUuaHLg 提取码&#xff1a;ture 二、安装步骤 1、打开虚拟机&#xff0c;单击“创建新的虚拟机”&#xff1b; 2、在出现的“新建虚拟机向导”窗口中&#xff0c;选择默认的“典型&#xff08;推荐&…

Spring中利用applicationContext.xml文件实例化对象和调用方法

Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘&#xff0c;链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q  提取码: shjd &#xff1b; 2.在eclipse中创建javaweb项目 1.第一次创建javaWEB项目操作步骤 1&#xff09;eclipse中运行javaWE…