Oh, My princess 郑大校赛

题目描述】
很久很久以前,有一个美丽的国度,国王有一个美丽的公主,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;	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值