【模拟】海盗藏宝

题目来源

浙财OJ

题目描述

为增进同学们彼此间的了解,9月中旬,信息学院举行智力游戏大赛,各班派代表参赛,对于每道题可协商后答题,同时可带笔记本电脑编程序实现。现有《海盗埋宝》一题,大意如下:
1.海盗以岛上的一颗大树为参照物,将所获得的宝物以一定规则埋藏在大树的周围。
2.埋藏的规则如下:将大树的位置记为坐标原点(0,0);以海盗的步长为标准长度1;海盗行走的方向为八个标准方向:N(north)、NE(northeast)、E(east)、SE(southeast)、S(south)、SW(southwest)、W(west)和NW(northwest);同时海盗行走表示方法为:3W表示往西走3步长,17NE表示往西北走17步长。
3.海盗将所走的方位记载在本子上,专门保管,需要时根据这些信息来挖宝。
本题要求解的是:给定海盗藏宝的行走过程,求宝藏埋藏的位置以及宝藏距大树的直线距离。

输入

输入文件中包含多个测试数据。每个测试数据占一行,表示海盗每次藏宝时的行走过程,格式如样例输入所示。最后一行为字符串"END",表示输入结束。

输出

对于输入文件中的每个测试数据,输出3行:第一行表示测试数据的序号;第二行为宝藏的位置;第三行表示宝藏离大树的距离。格式如样例输出所示。

样例输入

3N,1E,1N,3E,2S,1W.
10NW.
END

样例输出

Example #1
The treasure is located at (3.000,2.000).
The distance to the treasure is 3.606.
Example #2
The treasure is located at (-7.071,7.071).
The distance to the treasure is 10.000.

思路

东西方向上的移动用一个量计算,南北方向上的移动用一个量计算,如果是NE,就拆分成两个方向,移动的大小可根据三角形的就能算出

上代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int N=1e6+10; 
int main()
{
	string s;
	string s1="END";
	double n,e,z;//n存储南北方向的移动,e存储东西方向的移动 
	int a[100000]={0};//存储每次移动的步数 
	int j=1;//样例代号1,2..... 
	while(getline(cin,s)) //输入一整串移动路线 
	{	
		double x=0;		//存储步数
		if(s==s1)break;		//遇到END结束 
		z=0,n=0,e=0;		// 对于每一组数据初始化为0 
		int l=s.size();			//移动路线的长度 
		int t=0;				//存储每次移动步数的长度,见24行 
		for(int i=0;i<l;i++)
		{
			if(s[i]==','){
				x=0;		//遇到一个   ','  初始化为0 
				memset(a,0,sizeof(a));	//同上 
				t=0;		//同上 
			}
			if(s[i]=='.')break;		//结尾是'.'一组数据结束	
			else if(s[i]>='0'&&s[i]<='9')a[t++]=s[i]-'0';	//如果是数字,存储到整形数组里 
			else 
			{
				for(int k=t-1;k>=0;k--) 	//从向前取出步数 
					x+=a[k]*pow(10,t-1-k);	//转换为十进制数的步数 
				if(s[i]=='N'&&s[i+1]=='W')n+=sqrt(x*x/2),e-=sqrt(x*x/2),i++;	//如果是NW,n加上,e减去,i++(关键一步) 
				else if(s[i]=='N'&&s[i+1]=='E')n+=sqrt(x*x/2),e+=sqrt(x*x/2),i++;	//(因为是两个字符,例如NW,当前的i对于N,i加1后) 
				else if(s[i]=='S'&&s[i+1]=='E')n-=sqrt(x*x/2),e+=sqrt(x*x/2),i++;	//(再次循环,两个字符就跳过去了) 
				else if(s[i]=='S'&&s[i+1]=='W')n-=sqrt(x*x/2),e-=sqrt(x*x/2),i++;	//(不然,下面单字符的会再次用到NW中的W) 
				else if(s[i]=='N')n+=x;		//对于单字符的处理,下同 
				else if(s[i]=='S')n-=x;		
				else if(s[i]=='E')e+=x;		
				else if(s[i]=='W')e-=x;		
			}	
		}
		z=sqrt(n*n+e*e);		//计算距离 
		cout<<"Example #"<<j++<<endl;	//输出 
		printf("The treasure is located at (%.3lf,%.3lf).\n",e,n); 
		printf("The distance to the treasure is %.3lf.\n",z);
	}	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,"海盗船"通常指的是使用pygame库创建的一个简单的游戏项目,模拟海盗船的游戏体验。pygame是一个广泛用于开发2D游戏的Python模块,它提供了处理图形、音频和事件的功能。 一个简单的Python海盗船游戏可能会包含以下几个部分: 1. **游戏窗口**:pygame的display模块用于创建游戏窗口,显示海盗船和其他游戏元素。 2. **海盗船对象**:游戏中的主角,可能有位置、速度等属性,并通过图像或动画来表示。 3. **控制和输入**:玩家可以通过键盘或鼠标来控制海盗船的方向和移动。 4. **游戏循环**:游戏中会有一个主循环,不断更新游戏状态并绘制画面。 5. **碰撞检测**:如果游戏复杂些,可能还需要检测海盗船与其他物体(比如敌人、障碍物)的碰撞。 要开始制作这样一个游戏,你需要先安装pygame库,然后设计游戏规则和用户界面,编写代码实现游戏逻辑。以下是一些关键步骤的简要概述: ```python import pygame # 初始化pygame pygame.init() # 设置窗口大小和标题 screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("海盗船") # 加载海盗船图片 ship_image = pygame.image.load('pirate_ship.png') # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 更新海盗船位置 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: ship_position.x -= 5 elif keys[pygame.K_RIGHT]: ship_position.x += 5 # 绘制游戏画面 screen.fill((255, 255, 255)) # 清空屏幕 screen.blit(ship_image, ship_position) pygame.display.flip() # 游戏结束 pygame.quit() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值