Uva - 810 - A Dicey Problem
根据状态进行bfs,手动打表维护骰子滚动。
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <cstring> #include <string> #include <sstream> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <bitset> #include <cassert> #include <cmath> using namespace std; const int maxn = 65536; const int dx[] = { -1, 1, 0, 0 }; const int dy[] = { 0, 0, -1, 1 }; struct State { int x, y, top, front; State *prev; } states[maxn]; int statesIdx; int n, m, sx, sy, dtop, dfront; int g[32][32]; State* getNewState(int x, int y, int dtop, int dfront, State *prev = NULL) { State *p = &states[statesIdx++]; assert(statesIdx < maxn); p->x = x, p->y = y, p->top = dtop, p->front = dfront, p->prev = prev; return p; } int diceTable[7][7]; // [front][top] = right void rotateDice(int dir, int dtop, int dfront, int &rtop, int &rfront) { rtop = rfront = 1; if (dir == 0) { // 向上滚动 rtop = dfront, rfront = 7 - dtop; } else if (dir == 1) { // 向下滚动 rtop = 7 - dfront, rfront = dtop; } else if (dir == 2) { // 向左滚动 rfront = dfront; rtop = diceTable[dfront][dtop]; } else if (dir == 3) { // 向右滚动 rfront = dfront; rtop = 7 - diceTable[dfront][dtop]; } } void bfs(int sx, int sy, int dtop, int dfront) { statesIdx = 0; int used[32][32][7][7] = {}; // used[x][y][dtop][dfront] int tx, ty, tdtop, tdfront; queue<State*> Q; State *u, *v; Q.push(getNewState(sx, sy, dtop, dfront)); used[sx][sy][dtop][dfront] = 1; while (!Q.empty()) { u = Q.front(), Q.pop(); for (int i = 0; i < 4; i++) { tx = u->x + dx[i], ty = u->y + dy[i]; if (tx <= 0 || ty <= 0 || tx > n || ty > m) { continue; } if (g[tx][ty] != -1 && g[tx][ty] != u->top) { continue; } if (tx == sx && ty == sy) { vector< pair<int, int> > ret; State *p = u; ret.push_back(make_pair(sx, sy)); while (p != NULL) { ret.push_back(make_pair(p->x, p->y)); p = p->prev; } for (int i = ret.size() - 1, j = 0; i >= 0; i--, j++) { if (j % 9 == 0) printf(" "); if (j % 9 != 0) printf(","); printf("(%d,%d)", ret[i].first, ret[i].second); if (j % 9 == 8 || i == 0) { if (i) { printf(",\n"); } else { puts(""); } } } return; } rotateDice(i, u->top, u->front, tdtop, tdfront); if (used[tx][ty][tdtop][tdfront]) { continue; } used[tx][ty][tdtop][tdfront] = 1; v = getNewState(tx, ty, tdtop, tdfront, u); Q.push(v); } } printf(" No Solution Possible\n"); } int main() { // 手动打表维护骰子滚动 // diceface[front][top] = right diceTable[1][2] = 4, diceTable[1][3] = 2, diceTable[1][4] = 5, diceTable[1][5] = 3; diceTable[2][1] = 3, diceTable[2][3] = 6, diceTable[2][4] = 1, diceTable[2][6] = 4; diceTable[3][1] = 5, diceTable[3][2] = 1, diceTable[3][5] = 6, diceTable[3][6] = 2; diceTable[4][1] = 2, diceTable[4][2] = 6, diceTable[4][5] = 1, diceTable[4][6] = 5; diceTable[5][1] = 4, diceTable[5][3] = 1, diceTable[5][4] = 6, diceTable[5][6] = 3; diceTable[6][2] = 3, diceTable[6][3] = 5, diceTable[6][4] = 2, diceTable[6][5] = 4; char testcase[1024]; while (scanf("%s", testcase) == 1) { if (!strcmp("END", testcase)) break; scanf("%d %d %d %d %d %d", &n, &m, &sx, &sy, &dtop, &dfront); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &g[i][j]); } } printf("%s\n", testcase); bfs(sx, sy, dtop, dfront); } return 0; }
Uva - 810 - A Dicey Problem的更多相关文章
- UVA 810 - A Dicey Problem(BFS)
UVA 810 - A Dicey Problem 题目链接 题意:一个骰子,给你顶面和前面.在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地, ...
- UVA 810 A Dicey Promblem 筛子难题 (暴力BFS+状态处理)
读懂题意以后还很容易做的, 和AbbottsRevenge类似加一个维度,筛子的形态,可以用上方的点数u和前面的点数f来表示,相对的面点数之和为7,可以预先存储u和f的对应右边的点数,点数转化就很容易 ...
- UVa 101 The Blocks Problem Vector基本操作
UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...
- 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem
UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...
- UVA - 524 Prime Ring Problem(dfs回溯法)
UVA - 524 Prime Ring Problem Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & % ...
- uva 10837 - A Research Problem(欧拉功能+暴力)
题目链接:uva 10837 - A Research Problem 题目大意:给定一个phin.要求一个最小的n.欧拉函数n等于phin 解题思路:欧拉函数性质有,p为素数的话有phip=p−1; ...
- poj 1872 A Dicey Problem WA的代码,望各位指教!!!
A Dicey Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 832 Accepted: 278 Des ...
- poj1872A Dicey Problem
Home Problems Status Contest 284:28:39 307:00:00 Overview Problem Status Rank A B C D E F G H ...
- UVA 10026 Shoemaker's Problem 鞋匠的难题 贪心+排序
题意:鞋匠一口气接到了不少生意,但是做鞋需要时间,鞋匠只能一双一双地做,根据协议每笔生意如果拖延了要罚钱. 给出每笔生意需要的天数和每天的罚钱数,求出最小罚钱的排列顺序. 只要按罚款/天数去从大到小排 ...
随机推荐
- Tomcat性能调优-JVM监控与调优
参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...
- 3.5 find() 判断是否存在某元素
vector 判断是否存在某元素: if(find(A.begin(), A.end(), A[i]) != A.end()){ // 若存在 A[i] // find() 返回一个指针 }
- [原创]基于VueJs的前后端分离框架搭建之完全攻略
首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...
- 第一次作业:基于Linux操作系统深入源码进程模型分析
1.Linux操作系统的简易介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使 ...
- ACM Primes
Write a program to read in a list of integers and determine whether or not each number is prime. A n ...
- springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)
上一篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)中我们已经介绍了参数解析相关的东西,并且也提到了HandlerMethodArgume ...
- Vue 踩坑记
参考: https://forum.vuejs.org/t/unknown-issues-in-change-event-of-radio-in-vue-2-x-webpack-2-x/11034 v ...
- 安卓高级 WebView的使用到 js交互
我们先来学习 怎么使用再到用js和安卓源生方法交互 WebView简单使用 此部分转载并做了补充 原博客 原因:比较简单不是很想在写,我只要写js交互部分 WebView可以使得网页轻松的内嵌到app ...
- 阿里云服务器云数据库免费体验(Java Web详细实例)
一.效果展示 博主部署了两个war包到阿里云服务器上,一个是没有连接数据库的,另外一个是连接了数据库的. (由于阿里云服务器免费使用15天,下面链接约2016年3月9日后无效) (1)无数据库版访问地 ...
- Device Mapper 代码分析
Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备. DM以块设备的形式注册到Linux内核中,凡是挂载(或者说&quo ...