山东省第一届ACM大学生程序设计竞赛 Fairy tale 大模拟
2016-05-03 15:39
447 查看
Fairy tale
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
It is said that in a school’s underground, there is a huge treasure which can meetany desire of the owner.
The Spy Union (SU) is very interest in this legend. After much investigation, SU finally get the answer and let the youngest
spy sneak into the school. That’s why Saya is now here.
Today, Saya found the entrance eventually.
She enters the entrance, and found her in a fairy-tale world.
“Welcome!” says a fairy, “I am Ivan. My responsibility is to protect the treasure, and give it to the one who have the
ability to own it.”
Then Ivan gives Saya three problems.
With your help, Saya finished the first and the second problem (Problem H and I). Here comes the third. If Saya can solve
this problem, the treasure belongs to her.
There is a big maze protecting the treasure. You can assume the maze as an N*N matrix
while each element in the matrix might be N (North), S (South), W (West) or E (East). At first, Saya is at the element (1, 1) – the north-west corner, and the treasure is at (N, N)
– the south-east corner.
The designer have enchant to this matrix, so that the treasure might move from time to time respecting the following rules:
Suppose the treasure is in an element which marked with E. The treasure might eastward move a cell after a unit time. It
is similar to S, W and N.
After a unit time, all the mark will change: E to W, W to S,
S to N, and N to E. In another word, suppose an element which marked with E at time 0. At time 1, it might change to W, change to S at time 2, change to N at time 3, change to E at time 4, and so on.
Saya doesn't know the initial status of the marks. She is affected by this rule, but she decides to do something more.
Ivan gave Saya a special prop which called Riki. With Riki’s help, she can get the position of the treasure.
In each unit time, Saya will do all of the following three things:
Firstly, she will check the treasure’s position with Riki.
Secondly, she will move follow the designer’s magic the same with the treasure.(If no element exists in the direction of
movement,the movement will be cancelled.)
Thirdly, Saya can either move to one direction (N, S, E, and W) a cell or stay there. Saya prefers to be closer with the
treasure; if there are many ways with the same geometrical distance, Saya prefers to stay there than move, prefer E than W, W than N, and N than S. Here we should use the position checked at the first step.
You are given the size of the matrix and all the marks of the elements at time 0.
Your task is to simulate Saya and the treasure’s movement, and then tell Saya the result.
输入
The input consists of several test cases.The first line of input in each test case contains one integer N (0<N≤30),
which represents the size of the matrix.
Each of the next N lines contains a string whose length is N,
represents the elements of the matrix. The string only consists of N, E, W and S.
The last case is followed by a line containing one zero.
输出
For each case, print the case number (1, 2 …) and the result of Saya’s explore.If Saya can get the treasure at step
x (x≤100)(that means at the begainning of time x, Saya and the treasure stay in
the same cell), print “Get the treasure! At step x.”.
If after simulating x (x≤100)
steps, you found out that Saya can't get the treasure, print “Impossible. At step x.”
If you have simulated 100 steps but don’t know whether Saya can get the treasure, print “Not sure.”
Your output format should imitate the sample output. Print a blank line after each
test case.
示例输入
5 EWSSE NNENN EENNE SWSEW NSNSW 0
示例输出
Case 1: Get the treasure! At step 12.
提示
Q&AQ: How can I know it’s impossible for Saya to get the treasure?
A: Suppose at time 5, Saya at (1, 1) while the treasure at (2, 2); at time
13, Saya at (1, 1) while the treasure at (2, 2) again. Since both Saya and the treasure go to the same place and have the same direction again, it is a loop, and they will just repeats the moves forever. So at time 13, we can judge it is impossible.
来源
2010年山东省第一届ACM大学生程序设计竞赛示例程序
人在动图在动问能否找到宝藏
一开始以为是搜索后来发现是模拟
参考点击打开链接这篇博客
ACcode:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct P{
int px,py,tx,ty,sp;
}my[101];
int Map[31][31];
int dis[4][2]={0,1,0,-1,1,0,-1,0};
int n;
int t_x,t_y,flag,ttime,x,y;
bool better(int x,int y,int xx,int yy){
return (x-t_x)*(x-t_x)+(y-t_y)*(y-t_y) < (xx-t_x)*(xx-t_x)+(yy-t_y)*(yy-t_y);
}
bool can_step(int x,int y){
if(x<=0 || y<=0 || y>n || x>n) return 0;
return 1;
}
bool judge_re(){
int i;
for(i=0;i<ttime;++i)
if(my[i].px==x&&my[i].py==y&&my[i].tx==t_x&&my[i].ty==t_y&&my[i].sp==ttime%4){
flag=1;
return true;
}
my[i].px=x;my[i].py=y;my[i].tx=t_x;my[i].ty=t_y;my[i].sp==ttime%4;
return false;
}
bool step(){
int s1 = (Map[x][y]+ttime)%4;
int s2 = (Map[t_x][t_y]+ttime)%4;
if(judge_re()) return false;
if(x == t_x && y == t_y) return true;
int xx = x + dis[s1][0];
int yy = y + dis[s1][1];
if(can_step(xx,yy)) { x=xx,y=yy; }
xx=x,yy=y;
for(int i=0;i<4;i++){
int tx=x+dis[i][0];
int ty=y+dis[i][1];
if(can_step(tx,ty)&&better(tx,ty,xx,yy)){
xx=tx;
yy=ty;
}
}
x = xx, y = yy;
int txx = t_x + dis[s2][0];
int tyy = t_y + dis[s2][1];
if(can_step(txx,tyy)) { t_x=txx; t_y=tyy; }
++ttime;
return false;
}
int cnt=1;
void init(){
t_x=t_y=n;
ttime=flag=0;
x=y=1;
printf("Case %d:\n",cnt++);
}
void get_map(){
char c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>c;
if(c=='E') Map[i][j]=0;
if(c=='W') Map[i][j]=1;
if(c=='S') Map[i][j]=2;
if(c=='N') Map[i][j]=3;
}
}
void doit(){
while(ttime < 100){
if(step()){
printf("Get the treasure! At step %d.\n\n", ttime);
return;
}
if(flag){
printf("Impossible. At step %d.\n\n", ttime);
return;
}
if(ttime == 99){
printf("Not sure.\n\n");
return;
}
}
}
int main(){
while(scanf("%d",&n)&&n){
get_map();
init();
doit();
}
return 0;
}
/**************************************
Problem id : SDUT OJ 2156
User name : acmer
Result : Accepted
Take Memory : 512K
Take Time : 0MS
Submit Time : 2016-05-03 15:37:59
**************************************/
相关文章推荐
- samba “The specified network name is no longer available” 出错的解决办法
- 利用正则表达式:找到一段字符串中所有的IP地址和Email地址
- TensorFlow教程02:针对机器学习初学者的MNIST实验——Softmax回归
- mac上google chrome helper占内存,mac air 发热
- rails路由全解
- 在foxmail和outlook中设置QQ邮箱、gmail邮箱、新浪邮箱、微软邮箱、网易邮箱等的方法
- 【STL】SGI STL私房菜:_type_traits
- Failure to transfer org.apache.maven:maven-archiver:jar:x.x from https://repo.maven.apache.org/maven
- Rails技巧之tap&try
- androidStudio-importProject异常-Error:(1, 0) Your project path contains non-ASCII characters.
- HDU 4300 Clairewd’s message(扩展kmp)
- RAID磁盘利用率详解
- Software caused connection abort: recv failed
- Syntax error, parameterized types are only available if source level is 1.5
- Software caused connection abort: recv failed
- MegaSAS RAID卡 BBU Learn Cycle周期的影响
- bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)
- Mailto使用方法
- [BZOJ1660][Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)
- LeetCode 011 Container With Most Water *