A Dicey Problem
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 832   Accepted: 278

Description

The three-by-three array in Figure 1 is a maze. A standard six-sided die is needed to traverse the maze (the layout of a standard six-sided die is shown in Figure 2). Each maze has an initial position and an initial die configuration. In Figure 1, the starting position is row 1, column 2-the "2" in the top row of the maze-and the initial die configuration has the "5" on top of the die and the "1" facing the player (assume the player is viewing the maze from the bottom edge of the figure). 

To move through the maze you must tip the die over on an edge to land on an adjacent square, effecting horizontal or vertical movement from one square to another. However, you can only move onto a square that contains the same number as the number displayed on the top of the die before the move, or onto a "wild" square which contains a star. Movement onto a wild square is always allowed regardless of the number currently displayed on the top of the die. The goal of the maze is to move the die off the starting square and to then find a way back to that same square.

For example, at the beginning of the maze there are two possible moves. Since the 5 is on top of the die, it is possible to move down one square, and since the square to the left of the starting position is wild it is also possible to move left. If the first move chosen is to move down, this brings the 6 to the top of the die and moves are now possible both to the right and down. If the first move chosen is instead to the left, this brings the 3 to the top of the die and no further moves are possible.

If we consider maze locations as ordered pairs of row and column numbers (row, column) with row indexes starting at 1 for the top row and increasing toward the bottom, and column indexes starting at 1 for the left column and increasing to the right, the solution to this simple example maze can be specified as: (1,2), (2,2), (2,3), (3,3), (3,2), (3,1), (2,1), (1,1), (1,2). A bit more challenging example maze is shown in Figure 3.

The goal of this problem is to write a program to solve dice mazes. The input file will contain several mazes for which the program should search for solutions. Each maze will have either a unique solution or no solution at all. That is, each maze in the input may or may not have a solution, but those with a solution are guaranteed to have only one unique solution. For each input maze, either a solution or a message indicating no solution is possible will be sent to the output. 

Input

The input file begins with a line containing a string of no more than 20 non-blank characters that names the first maze. The next line contains six integers delimited by single spaces. These integers are, in order, the number of rows in the maze (an integer from 1 to 10, call this value R), the number of columns in the maze (an integer from 1 to 10, call this value C), the starting row, the starting column, the number that should be on top of the die at the starting position, and finally the number that should be facing you on the die at the starting position. The next R lines contain C integers each, again delimited by single spaces. This R * C array of integers defines the maze. A value of zero indicates an empty location in the maze (such as the two empty squares in the center column of the maze in Figure 3), and a value of -1 indicates a wild square. This input sequence is repeated for each maze in the input. An input line containing only the word "END" (without the quotes) as the name of the maze marks the end of the input.

Output

The output should contain the name of each maze followed by its solution or the string "No Solution Possible" (without the quotes). All lines in the output file except for the maze names should be indented exactly two spaces. Maze names should start in the leftmost column. Solutions should be output as a comma-delimited sequence of the consecutive positions traversed in the solution, starting and ending with the same square (the starting square as specified in the input). Positions should be specified as ordered pairs enclosed in parentheses. The solution should list 9 positions per line (with the exception of the last line of the solution for which there may not be a full 9 positions to list), and no spaces should be present within or between positions.

Sample Input

DICEMAZE1
3 3 1 2 5 1
-1 2 4
5 5 6
6 -1 -1
DICEMAZE2
4 7 2 6 3 6
6 4 6 0 2 6 4
1 2 -1 5 3 6 1
5 3 4 5 6 4 2
4 1 2 0 3 -1 6
DICEMAZE3
3 3 1 1 2 4
2 2 3
4 5 6
-1 -1 -1
END

Sample Output

DICEMAZE1
(1,2),(2,2),(2,3),(3,3),(3,2),(3,1),(2,1),(1,1),(1,2)
DICEMAZE2
(2,6),(2,5),(2,4),(2,3),(2,2),(3,2),(4,2),(4,1),(3,1),
(2,1),(2,2),(2,3),(2,4),(2,5),(1,5),(1,6),(1,7),(2,7),
(3,7),(4,7),(4,6),(3,6),(2,6)
DICEMAZE3
No Solution Possible

Source

这个题让我很伤心,贴一个深搜的代码,是WA的,检查很多遍了都不知道错哪了,望大神赐教啊,哪组数据有问题说说也可以啊,我测了我能找到的所有数据都没发现问题,实在是不想留下这个遗憾啊
#include<stdio.h>
#include<string.h>
#include<ctype.h> int r,c,map[15][15],vis[15][15][7][7],die[][6]={{7,4,2,5,3,7},{3,7,6,1,7,4},{5,1,7,7,6,2},{2,6,7,7,1,5},{4,7,1,6,7,3},{7,3,5,2,4,7}};//die[i][j]表示i+1为top j+1为face时骰子左边的点数
int sr,sc;//face[7]={0,6,5,4,3,2,1},
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},w,deep;
char name[25]; struct point
{
int i,j,fi,fj;
}s[3000]; int bound(int y,int x)
{
if(x>=1&&x<=c&&y>=1&&y<=r)
return 1;
else
return 0;
} int dfs(struct point a,int facenum,int topnum)//r是行c是列
{
int i,j;
if(a.i==sr&&a.j==sc&&deep>0)
return 1;
deep++;
for(i=0;i<4;i++)
{
if(bound(a.i+dy[i],a.j+dx[i])&&(map[a.i+dy[i]][ a.j+dx[i]]==-1||map[a.i+dy[i]][a.j+dx[i]]==topnum))
{
if(i<2)
{
if(i==0)
{
if(!vis[a.i+1][a.j][topnum][7-facenum])//表示向下滚(i增大)
{
vis[a.i+1][a.j][topnum][7-facenum]=1;
s[w].i=a.i+1;
s[w].j=a.j;//s[w].fi=a.i;s[w].fj=a.j;
w++;
if(dfs(s[w-1],topnum,7-facenum))
{
// printf("(%d,%d)",a.i,a.j);
return 1;
}
else w--;
}
}
else
{
if(!vis[a.i-1][a.j][7-topnum][facenum])//向上滚(也就是i减小的方向)
{
vis[a.i-1][a.j][7-topnum][facenum]=1;
s[w].i=a.i-1;
s[w].j=a.j;//s[w].fi=a.i;s[w].fj=a.j;
w++;
if(dfs(s[w-1],7-topnum,facenum))
{
// printf("(%d,%d)",a.i,a.j);
return 1;
}
else w--;
}
}
}
else
{
if(i==2)
{
if(!vis[a.i][a.j+1][facenum][die[topnum-1][facenum-1]])//向右滚
{
vis[a.i][a.j+1][facenum][die[topnum-1][facenum-1]]=1;
s[w].i=a.i;
s[w].j=a.j+1;//s[w].fi=a.i;s[w].fj=a.j;
w++;
if(dfs(s[w-1],facenum,die[topnum-1][facenum-1]))
{
// printf("(%d,%d)",a.i,a.j);
return 1;
}
else w--;
}
}
else
{
if(!vis[a.i][a.j-1][facenum][7-die[topnum-1][facenum-1]])//向左滚
{
vis[a.i][a.j-1][facenum][7-die[topnum-1][facenum-1]]=1;
s[w].i=a.i;
s[w].j=a.j-1;//s[w].fi=a.i;s[w].fj=a.j;
w++;
if(dfs(s[w-1],facenum,7-die[topnum-1][facenum-1]))
{
// printf("(%d,%d)",a.i,a.j);
return 1;
}
else w--;
}
}
}
}
}
return 0;
} int scan()//优化输入的
{
char c;
int ret;
int sig=0;
while(isspace(c=getchar()))
;
if(c=='-')
{
sig=1;
c=getchar();
}
ret=c-'0';
while((c=getchar())>='0'&& c<='9')
ret=ret*10+c-'0';
return sig?-ret:ret;
}
int main()
{
int i,j,k,ft,ff;
while(1)
{
gets(name);
if(strcmp(name,"END")==0)
break;
//scanf("%d%d%d%d%d%d",&r,&c,&sr,&sc,&ft,&ff);
r=scan();
c=scan();
sr=scan();
sc=scan();
ft=scan();
ff=scan();
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
//scanf("%d",&map[i][j]);
map[i][j]=scan();
}
//getchar();
memset(s,0,sizeof(s));
memset(vis,0,sizeof(vis));
s[0].i=sr;
s[0].j=sc;
w=1;
puts(name);
deep=0;
if(dfs(s[0],ff,ft))
{
printf(" ");
for(i=0;i<w-1;i++)
{
printf("(%d,%d),",s[i].i,s[i].j);
if((i+1)%9==0)
{
printf("\n ");
}
}
printf("(%d,%d)\n",s[i].i,s[i].j);
}
else printf(" No Solution Possible\n");
}
return 0;
}

poj 1872 A Dicey Problem WA的代码,望各位指教!!!的更多相关文章

  1. POJ 2826 An Easy Problem? 判断线段相交

    POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...

  2. UVA 810 - A Dicey Problem(BFS)

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

  3. UVA-810 A Dicey Problem (BFS)

    题目大意:滚骰子游戏,骰子的上面的点数跟方格中的数相同时或格子中的数是-1时能把格子滚过去,找一条从起点滚到起点的路径. 题目大意:简单BFS,状态转移时细心一些即可. 代码如下; # include ...

  4. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  5. POJ 3468 A Simple Problem with Integers 【线段树,区间更新】

    题意:你有N个整数,A1,A2,-,一个.你须要处理两种类型的操作.一种类型的操作是加入了一些给定的数字,每一个数字在一个给定的时间间隔. 还有一种是在给定的时间间隔要求数量的总和. 难点:主要是la ...

  6. POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)

    POJ 3468.A Simple Problem with Integers 这个题就是成段的增减以及区间查询求和操作. 代码: #include<iostream> #include& ...

  7. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  8. POJ 1152 An Easy Problem! (取模运算性质)

    题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...

  9. 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 ...

随机推荐

  1. Ajax技术——带进度条的文件上传

    1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运 ...

  2. 正确处理Windows电源事件

    简介为系统挂起与恢复而进行的应用准备步骤 曾几何时,当您正要通过应用提交或发布一些重要数据时,突然遇到一些急事需要处理,而且会耽误很长时间.当您完成任务回到电脑前时,发现电脑已经自动进入 了挂起状态, ...

  3. 基于perl面向对象开发的微信机器人

    <pre name="code" class="html">[root@wx03 lib]# ls -ltr total 40 -rw-r--r-- ...

  4. perl 使用SUPER类来访问覆盖的方法

    有时候,你希望一个衍生类的方法表现得象基类中的某些方法的封装器 这就是 SUPER 伪类提供便利的地方.它令你能够调用一个覆盖了的基类方法,而不用声明 是哪个类定义了该方 法.(注:不要把这个和第十一 ...

  5. css盒模型和块级、行内元素深入理解

    盒模型是CSS的核心知识点之一,它指定元素如何显示以及如何相互交互.页面上的每个元素都被看成一个矩形框,这个框由元素的内容.内边距.边框和外边距组成,需要了解的朋友可以深入参考下 一.CSS盒模型 盒 ...

  6. FreeLink开源呼叫中心设计思想

    上一篇大概说了国内外优秀的呼叫中心系统: 国内外优秀呼叫中心系统简单介绍 借鉴上述呼叫中心系统,我们的设计新一代呼叫中心例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  7. MySql自己定义排序

    查询语句: select id,name,stauts from special where id in (50,51,52,53,54,55) order by FIELD( id ,51,50, ...

  8. Effective C++_笔记_条款09_绝不在构造和析构过程中调用virtual函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: ...

  9. iframe - 基本用法

    · 用target的值,指向iframe框架的name值. <body> <form id="form1" runat="server"> ...

  10. JSP的学习(3)——语法知识二之page指令

    本篇接上一篇<JSP的学习(2)——语法知识一>,继续来学习JSP的语法.本文主要从JSP指令中的page指令,对其各个属性进行详细的学习: JSP指令: JSP指令是为JSP引擎而设计的 ...