当前位置: 首页 > news >正文

161行的华容道程序

比吕震宇的慢多了,我的Intel N100上0.624s,他的兆芯KX-6640MA上0.314秒。

Clipboard01

写都写了,贴出来吧:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unordered_set>
using std::unordered_set;
typedef unsigned char byte;const char* NM[] = { "", "", "", "", "", "", "", "", "", "" };
int W[] = { 2, 2, 2, 2, 2, 2, 1, 1, 1, 1 };
int H[] = { 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
const int D[4][2] = { 0, -1, 0, 1, -1, 0, 1, 0 };enum { QMAX = 36 * 1000 * 1000 };
struct State {uint64_t  xys; // xy坐标们byte b[5][4];int p; // 局面路径的previous// int next; // Hash表里的nextvoid clear () { xys = 0; memset(b, 0, sizeof(b)); }State& operator= (int a[10][2]);void toary(int a[10][2]);void operator= (const char* s);void print(const char* s = "");bool _can_move (int a[10][2], int i, int j);bool can_move (int a[10][2], int i, int j);
} states[QMAX + 40];
int qh, qt = 1; // queue head, tail
unordered_set<uint64_t> seen; // 改Hash表,和states二合一

State& State::operator= (int a[10][2]) {for (int i = 0; i < 10; i++) {const uint64_t  x = a[i][0], y = a[i][1];xys |= ((x << 3) | y) << (i * 5); // gcc不-O都会换成<<2再+1for (int yy = y; yy < y + H[i]; yy++)for (int xx = x; xx < x + W[i]; xx++)b[yy][xx] = 1;}return *this;
}void State::toary (int a[10][2]) {for (int i = 0; i < 10; i++) {int xy = xys >> (i * 5);a[i][0] = (xy >> 3) & 3; // xa[i][1] = xy & 7; // y
  }
}void State::operator= (const char* s) {int a[10][2] = {}, g = 1, p = 6;for (int x = 3; x >= 0; x--)for (int y = 4; y >= 0; y--) {#define CASE(c, i) case c: a[i][0] = x; a[i][1] = y; break;switch (s[x * 5 + y]) {CASE('c', 0) CASE('g', 1) // 曹关CASE('z', 2) CASE('h', 3) // 张黄CASE('l', 4) CASE('m', 5) // 子龙(l) 马case 'p': a[p][0] = x; a[p++][1] = y;}}static const char*  S[] = { "gg", "zz", "hh", "ll", "mm" };for (int i = 0; i < 5; i++)if (strstr(s, S[i])) W[i+1] = 1, H[i+1] = 2;*this = a;
}void State::print (const char* s) {const char* b[5][4] = {};int a[10][2]; toary(a);for (int i = 0; i < 10; i++) {int x = a[i][0], y = a[i][1];for (int yy = y; yy < y + H[i]; yy++)for (int xx = x; xx < x + W[i]; xx++)b[yy][xx] = NM[i];}for (int y = 0; y < 5; y++) {for (int x = 0; x < 4; x++) printf("%s", b[y][x] ? : " ");puts("");}printf("%s\n", s);
}bool State::can_move (int a[10][2], int i, int j) {int  ox = a[i][0], oy = a[i][1];bool ok = _can_move(a, i, j);char s[256];sprintf(s, "%s: %d,%d -> %d,%d %s", NM[i], ox, oy, a[i][0], a[i][1], ok ? "OK" : "");print(s); getchar();return ok;
}bool State::_can_move (int a[10][2], int i, int j) {const int ox = a[i][0], oy = a[i][1];int x = (a[i][0] += D[j][0]), y = (a[i][1] += D[j][1]);if (x < 0 || x + W[i] > 4 || y < 0 || y + H[i] > 5) return false;//D[4][2] = { 0,-1, 0,1, -1,0, 1,0 };if (j == 0) {for (int w = 0; w < W[i]; w++) if (b[y][x + w]) return false;return true;}else if (j == 1) {y = oy + H[i];for (int w = 0; w < W[i]; w++) if (b[y][x + w]) return false;return true;}else if (j == 2) {for (int h = 0; h < H[i]; h++) if (b[y + h][x]) return false;return true;}else {x = ox + W[i];for (int h = 0; h < H[i]; h++) if (b[y + h][x]) return false;return true;}
}void print_path () {// 用数组存放的单链表就地翻转int prev = -1, next = -1;for (int cur = qh; cur != -1;) {next = states[cur].p;states[cur].p = prev;prev = cur; cur = next;}int n = 0;for (int p = 0; p != -1; p = states[p].p) {// states[p].print();++n;}printf("%d\n", n);
}int main () {//states[0] = "pp zz""ccghh""ccgll""pp mm";states[0] = "pzzpg""cc  g""ccllm""phhpm";states[0].print();states[0].p = -1;seen.insert(states[0].xys);for (; qh < qt; qh++) {int a[10][2]; states[qh].toary(a);if (a[0][1] == 3) { print_path(); break; }for (int i = 0; i < 10; i++)for (int j = 0; j < 4; j++) {if (states[qh]._can_move(a, i, j)) {states[qt] = a;if (seen.find(states[qt].xys) == seen.end()) {seen.insert(states[qt].xys);states[qt++].p = qh;}else states[qt].clear();}a[i][0] -= D[j][0]; a[i][1] -= D[j][1];}}printf("%d\n", qt);return 0;
}
View Code
http://www.jsqmd.com/news/19483/

相关文章:

  • 调用ack集群 api 接口删除Terminating状态的资源
  • 二十三、K8s企业级架构设计及落地
  • 题解:P9464 [EGOI 2023] Padel Prize Pursuit / 追梦笼式网球
  • 软件工程课程第二次团队作业
  • AGC 板刷记录2
  • 2025 年涿州装修公司最新推荐榜,深度解析企业服务能力与市场口碑优势
  • 结对编程项目总结
  • 刘强东带火数字人直播?商业化逐步成熟,逐渐取代真人带货!zhibo175
  • Hive事务管理详解:从ACID原理到UPDATE/DELETE实战 - 实践
  • TabControl控件
  • 权威调研榜单:硬质合金挤压模具厂家TOP3综合实力深度解析
  • 详细介绍:【Linux指南】gdb进阶技巧:断点高级玩法与变量跟踪实战
  • Nacos 3.1.0 正式发布,支持 A2A 注册中心与 MCP 注册协议增强
  • 2025 年点火器厂家最新推荐排行榜:综合评估高能 / 自动 / 防爆等多类型产品,精选优质品牌
  • VS2026 使用 WebDeploy 发布到 IIS - Jeff
  • 2025 激光灯厂家最新推荐榜:全方位测评核心实力与潜力,甄选优质供应商实用指南
  • SpringBoot3 集成Junit4 - 实践
  • 详细介绍:Spark Shuffle:分布式计算的数据重分布艺术
  • 2025 年火焰检测器生产厂家最新推荐权威排名:涵盖防爆 / 一体化 / 紫外线 / 离子 / 红外线 / 红紫外复合 / 智能型,多维度解析助力企业精准选型
  • 排序算法的介绍
  • 调理neovide之 自定义keymap-不用starter-template的话,直接init.lua中改
  • MyEMS:用开源撕开能源管理 “黑箱”,让节能不再 “凭感觉”
  • FPGA控制RGMII接口PHY芯片基础
  • kettle基本操作4:使用日期字段增量数据同步
  • 冰川之国破例:冰岛首次发现蚊子,气候变化敲响警钟
  • 成语趣有奖微信小程序管理系统:趣味与变现兼具的优质选择
  • 2025 年钛棒厂家最新推荐权威榜单:深度解析国内头部厂家国际市场开拓成绩及产品优势钛螺丝/加工件/医用/合金/异形件钛棒厂家推荐
  • 掌门社交电商系统:赋能本地生活的三方共赢新生态
  • 就餐宝微信小程序:重塑企业食堂管理新生态
  • 2025 年度茶叶行业优质厂家权威榜单:最新推荐全解析,小青柑 / 普洱等好茶选品指南