题目描述】
很久很久以前,有一个美丽的国度,国王有一个美丽的公主,Snowy。这个国度风平浪静了好多年,忽然有一天,有一位巫婆为了得到美丽的容颜(因为她听说吃掉美丽的姑娘的心可以变得更美丽,重口味啊),准备对Snowy 下手,而且,她得逞了(神马护卫都是浮云啊!)。国王很愤怒,经调查,Snowy 被关押在这个王国的最东边的一个屋子里。Snowy 的未婚夫Doctorinmit 听到后,毅然决然决定去拯救他的爱人。下面给出一个王国的地图,因为王国是依河而建,所以王国的形状是一个3 行N 列的格子,周围被城墙包围,每个格子要么是空地用’O’表示,要么是民居,用’#’表示,Doctorinmit起始位置永远在城堡的所在地,第1 列,第2 行的格子处。因为Doctorinmit 的马喜欢走斜线,所以Doctorinmit 只能走当前格子的四个方向(左下,左上,右下,右上),当然,不可以越过王国的城墙,也不可以穿过民居。Snowy 的位置永远在第N 列第2 行的格子处(数
据保证公主的位置永远是空地’O’,Doctorinmit 的位置永远是城堡’#’),Doctorinmit 能否拯救出他的爱人呢?由于他被愤怒冲昏了脑袋,暂时没有思考能力,所以他来向——国王的谋士来求助他是否可以骑马到达公主位置。因为如果他骑马到达不了公主的位置,他考虑用最先进的坐骑——灰鸡!(可直达公主地,但是稍微有点慢)。
【标准输入】
第一行: T 表示测试数据组数T (1<=T<=100)
对于每组测试数据:
第1 行为王国的列数N(2 <= N <= 1000)
接下来3 行为王国的形状,用’O’ ‘#’表示
【标准输出】
如果Doctorinmit(坐标为(2,1))可以到达Snowy 的位置(坐标为(2,N)),输出”Bingo!”,
反之,输出”It’s HuiJi’s time!”。
每组测试数据输出一行
下面是别人简洁的代码,只要认真分析,其实这道题的数据还是很有意思的。。
很久很久以前,有一个美丽的国度,国王有一个美丽的公主,Snowy。这个国度风平浪静了好多年,忽然有一天,有一位巫婆为了得到美丽的容颜(因为她听说吃掉美丽的姑娘的心可以变得更美丽,重口味啊),准备对Snowy 下手,而且,她得逞了(神马护卫都是浮云啊!)。国王很愤怒,经调查,Snowy 被关押在这个王国的最东边的一个屋子里。Snowy 的未婚夫Doctorinmit 听到后,毅然决然决定去拯救他的爱人。下面给出一个王国的地图,因为王国是依河而建,所以王国的形状是一个3 行N 列的格子,周围被城墙包围,每个格子要么是空地用’O’表示,要么是民居,用’#’表示,Doctorinmit起始位置永远在城堡的所在地,第1 列,第2 行的格子处。因为Doctorinmit 的马喜欢走斜线,所以Doctorinmit 只能走当前格子的四个方向(左下,左上,右下,右上),当然,不可以越过王国的城墙,也不可以穿过民居。Snowy 的位置永远在第N 列第2 行的格子处(数
据保证公主的位置永远是空地’O’,Doctorinmit 的位置永远是城堡’#’),Doctorinmit 能否拯救出他的爱人呢?由于他被愤怒冲昏了脑袋,暂时没有思考能力,所以他来向——国王的谋士来求助他是否可以骑马到达公主位置。因为如果他骑马到达不了公主的位置,他考虑用最先进的坐骑——灰鸡!(可直达公主地,但是稍微有点慢)。
【标准输入】
第一行: T 表示测试数据组数T (1<=T<=100)
对于每组测试数据:
第1 行为王国的列数N(2 <= N <= 1000)
接下来3 行为王国的形状,用’O’ ‘#’表示
【标准输出】
如果Doctorinmit(坐标为(2,1))可以到达Snowy 的位置(坐标为(2,N)),输出”Bingo!”,
反之,输出”It’s HuiJi’s time!”。
每组测试数据输出一行
输入样例 输出样例
2
5
O####
##O#O
OO#OO
3
###
##O
###
Bingo!
It’s HuiJi’s time!
下面是我写的。。。看到别人写的,瞬间觉得丢人了。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
int map[3][1005];
bool vis[3][1005];
int dir[4][2] = {{-1,-1}, {-1,1}, {1,-1}, {1,1}};
using namespace std;
struct point
{
int x, y;
};
void init(int n)
{
int i,j;
char c;
for(i=0; i<3; i++)
{
for(j=0; j<n; j++)
{
scanf("%c",&c);
if(c=='o')map[i][j] = 1;
if(c=='#')map[i][j] = 0;
}
getchar();
}
}
void bfs(int n)
{
memset(vis,false,sizeof(vis));
vis[1][0] = true;
queue<point> Q;
point e = {1,0};
Q.push(e);
bool flag = false;
while(!Q.empty())
{
e = Q.front();
if(e.x==1&&e.y==(n-1))
{
flag = true;
break;
}
Q.pop();
for(int w=0; w<3; w++)
for(int v=0; v<n; v++)
for(int i=0; i<4; i++)
{
point e1 = {e.x+dir[i][0], e.y+dir[i][1]};
if(e1.x>=0&e1.x<3&&e1.y>=0&&e1.y<n&&!vis[e1.x][e1.y]&&map[e1.x][e1.y])
{
vis[e1.x][e1.y] = true;
Q.push(e1);
}
}
}
if(flag) printf("Bingo!\n");
else printf("It's HuiJi's time!\n");
while(!Q.empty())
{
Q.pop();
}
}
int main()
{
int ncase, n;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d",&n);
getchar();
init(n);
bfs(n);
}
system("pause");
return 0;
}
下面是别人简洁的代码,只要认真分析,其实这道题的数据还是很有意思的。。
#include <stdio.h>
const int MAX = 1010;
char s[3][MAX];
bool middle(int n)
{
for(int i=2; i<n; i+=2)
if( s[1][i] == '#' )
return false;
return true;
}
bool top_bottom(int n)
{
for(int i=1; i<n; i+=2)
if( s[0][i] == '#' && s[2][i] == '#' )
return false;
return true;
}
bool solve(int n)
{
if( middle(n) == false )
return false;
if( top_bottom(n) == false )
return false;
return true;
}
int main()
{
int ncases, n;
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
scanf("%d", &ncases);
while( ncases-- )
{
scanf("%d", &n);
for(int i=0; i<3; i++)
scanf("%s", s[i]);
if( n % 2 == 0 )
{
puts("It's HuiJi's time!");
continue;
}
bool ans = solve(n);
if( ans )
puts("Bingo!");
else
puts("It's HuiJi's time!");
}
return 0;
}