题目大意:滚骰子游戏,骰子的上面的点数跟方格中的数相同时或格子中的数是-1时能把格子滚过去,找一条从起点滚到起点的路径。

题目大意:简单BFS,状态转移时细心一些即可。

代码如下;

# include<iostream>
# include<cstdio>
# include<map>
# include<string>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; struct Node
{
int x,y,s,t;
string px,py;
Node(int _x,int _y,int _s,int _t,string _px,string _py):x(_x),y(_y),s(_s),t(_t),px(_px),py(_py){}
bool operator < (const Node &a) const {
return t>a.t;
}
};
int Left[50],Right[50],vis[10][10][50],mp[10][10],r,c;
int behind[6]={6,5,4,3,2,1};
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
string name; void init()
{
Left[9]=4,Right[9]=3;
Left[12]=3,Right[12]=4;
Left[10]=2,Right[10]=5;
Left[11]=5,Right[11]=2; Left[15]=3,Right[15]=4;
Left[20]=4,Right[20]=3;
Left[18]=1,Right[18]=6;
Left[17]=6,Right[17]=1; Left[22]=5,Right[22]=2;
Left[27]=2,Right[27]=5;
Left[23]=1,Right[23]=6;
Left[26]=6,Right[26]=1; Left[29]=2,Right[29]=5;
Left[34]=5,Right[34]=2;
Left[30]=6,Right[30]=1;
Left[33]=1,Right[33]=6; Left[36]=4,Right[36]=3;
Left[41]=3,Right[41]=4;
Left[38]=1,Right[38]=6;
Left[39]=6,Right[39]=1; Left[44]=3,Right[44]=4;
Left[47]=4,Right[47]=3;
Left[46]=2,Right[46]=5;
Left[45]=5,Right[45]=2;
} bool ok(int x,int y)
{
return x>=0&&x<r&&y>=0&&y<c;
} void bfs(int sx,int sy,int ss)
{
priority_queue<Node>q;
memset(vis,0,sizeof(vis));
string path="";
q.push(Node(sx,sy,ss,0,path+(char)(sx+'A'),path+(char)(sy+'A')));
while(!q.empty())
{
Node u=q.top();
q.pop(); if(u.t&&u.x==sx&&u.y==sy){
int l=u.px.size();
for(int i=0;i<l;++i){
if(i==0)
printf(" ");
printf("(%d,%d)",u.px[i]-'A'+1,u.py[i]-'A'+1);
if(i==l-1)
printf("\n");
else if(i%9==8)
printf(",\n ");
else
printf(",");
}
return ;
} int dd[4]={u.s%7,behind[u.s%7-1],Right[u.s],Left[u.s]};
for(int i=0;i<4;++i){
int nx=u.x+d[i][0],ny=u.y+d[i][1];
if(ok(nx,ny)&&(mp[nx][ny]==(u.s/7)||mp[nx][ny]==-1)){
int k=u.s%7;
if(i==0)
k=behind[u.s/7-1];
if(i==1)
k=u.s/7;
if(!vis[nx][ny][dd[i]*7+k]){
vis[nx][ny][dd[i]*7+k]=1;
q.push(Node(nx,ny,dd[i]*7+k,u.t+1,u.px+(char)(nx+'A'),u.py+(char)(ny+'A')));
}
}
}
}
printf(" No Solution Possible\n");
} int main()
{
//freopen("UVA-810 A Dicey Problem.txt","r",stdin);
int sx,sy,st,sf;
init();
while(cin>>name)
{
if(name=="END")
break;
scanf("%d%d%d%d%d%d",&r,&c,&sx,&sy,&st,&sf);
for(int i=0;i<r;++i)
for(int j=0;j<c;++j)
scanf("%d",&mp[i][j]);
cout<<name<<endl;
bfs(sx-1,sy-1,st*7+sf);
}
return 0;
}

  

UVA-810 A Dicey Problem (BFS)的更多相关文章

  1. UVA 810 - A Dicey Problem(BFS)

    UVA 810 - A Dicey Problem 题目链接 题意:一个骰子,给你顶面和前面.在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地, ...

  2. UVa 1363 - Joseph's Problem(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVa 1640 - The Counting Problem(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVa 439骑士的移动(BFS)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVa 816 Abbott的复仇(BFS)

    寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...

  6. Uva - 810 - A Dicey Problem

    根据状态进行bfs,手动打表维护骰子滚动. AC代码: #include <iostream> #include <cstdio> #include <cstdlib&g ...

  7. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

  8. SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...

  9. SDUT-2139_从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在古老的魔兽 ...

随机推荐

  1. try...finally的妙用

    受博文 C#中Finally的一个不太常见的用法 的启发,正好在开发中遇到这样一段代码: public bool ChangeBlogApp(Guid userID, string oldBlogAp ...

  2. tomcat的server.xml中的Context节配置

    Tomcat的默认网站目录是:C:\Tomcat 9.0\webapps\ROOT,里面的index.jsp,就是tomcat官方提供的默认页,如果按照默认配置,访问链接应当是http://local ...

  3. AWR之-enq TX - row lock contention的性能故障-转

    1 对这一个小时进行AWR的收集和分析,首先,从报告头中看到DB Time达到近500分钟,(DB Time)/Elapsed=8,这个比值偏高:   Snap Id Snap Time Sessio ...

  4. Oracle安装部署之 timesten install on redhat6.5

    一.安装前检查 [root@localhost ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (San ...

  5. mysql查询乱码解决方法

    http://blog.csdn.net/u012408083/article/details/52734762 MySQL 命令行查询乱码 编码问题 当使用数据库工具查询数据时显示数据正常,中文也很 ...

  6. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

  7. SQL Server 不同网段IP通过名称访问

    1, 设置订阅服务器C:\Windows\System32\drivers\etc目录的host文件,添加分发服务器(我的环境是发布服务器与分发服务器 是一起的,所以这里指定的是发布服务器的地址)信息 ...

  8. android 的 ExpandableListView Example Tutorial

    https://www.journaldev.com/9942/android-expandablelistview-example-tutorial Welcome to Android Expan ...

  9. WebService—CXF—实现接口发布和客户端调用

    (一)接口发布的几种方式 定义接口: @WebService(targetNamespace="http://www.itfad.net/queryUser") public in ...

  10. 文件下载—SSM框架文件下载

    1.准备上传下载的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>common ...