poj 1872 A Dicey Problem WA的代码,望各位指教!!!
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 832 | Accepted: 278 |
Description
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
Output
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
#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的代码,望各位指教!!!的更多相关文章
- POJ 2826 An Easy Problem? 判断线段相交
POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...
- UVA 810 - A Dicey Problem(BFS)
UVA 810 - A Dicey Problem 题目链接 题意:一个骰子,给你顶面和前面.在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地, ...
- UVA-810 A Dicey Problem (BFS)
题目大意:滚骰子游戏,骰子的上面的点数跟方格中的数相同时或格子中的数是-1时能把格子滚过去,找一条从起点滚到起点的路径. 题目大意:简单BFS,状态转移时细心一些即可. 代码如下; # include ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- POJ 3468 A Simple Problem with Integers 【线段树,区间更新】
题意:你有N个整数,A1,A2,-,一个.你须要处理两种类型的操作.一种类型的操作是加入了一些给定的数字,每一个数字在一个给定的时间间隔. 还有一种是在给定的时间间隔要求数量的总和. 难点:主要是la ...
- POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)
POJ 3468.A Simple Problem with Integers 这个题就是成段的增减以及区间查询求和操作. 代码: #include<iostream> #include& ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- POJ 1152 An Easy Problem! (取模运算性质)
题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...
- 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 ...
随机推荐
- 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
首先下载CodeSmith工具:在百度云中,在CodeSmith文件夹中. 安装,使用激活工具激活. 然后下载NHibernate模板,也是在百度云中,在CodeSmith文件夹中. 之后直接点击NH ...
- NHibernate -- HQL
使用NHibernate中的HQL来查询数据. 代码: /// <summary> /// 查找事件 /// </summary> private void btn_Selec ...
- 基于visual Studio2013解决面试题之1204大数组查找
题目
- fileziller 恢复 站点管理器 内的ftp帐号方法
由于系统坏了重装了系统,以前的fileziller中配置的服务器链接信息列表很多,新装fileziller后即使复制以前的安装目录过来,站点管理器内还是空荡荡的. 这些服务器链接的配置信息非常重要,如 ...
- iOS进阶面试题----经典10道
OneV‘s Den在博客里出了10道iOS面试题,用他的话是:"列出了十个应聘Leader级别的高级Cocoa/CocoaTouch开发工程师所应该掌握和理解的技术" . 在这 ...
- QT中.pro文件的写法
QT中.pro文件的写法 qmake 变量 含义 #xxxx 注释, 从“#”开始,到这一行结束 SOURCES 指定源文件 SOURCES = *.cpp 对于多源文件,可用空格分开 SOURC ...
- oracle执行带输入输入参数的存储过程
declare a1 ); a2 ); begin PKG_INPATIENT.prc_autojf('Y', a1, a2); end;
- JQuery - 点击图片显示大图
效果: 目录结构: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...
- faith的23堂课:培养良好的工作方法与做事风格
目标:通过每天一点的学习和实践,逐步形成好的做事风格和工作生活习惯. 方式:每天教一点,实践一点. 第一课 计划与总结,工作日志,戴明环 第二课 目的性:搞清楚,你每个行为的目的 第三课 目标管理,调 ...
- 网络数据(socket)传输总结
环境限定:TCP/IP下的socket网络传输:C/C++开发语言,32/64位机. 目前有两种方式对数据进行传输:1)字符流形式,即将数据用字符串表示:2)结构型方式,即将数据按类型直接传输. 1) ...