坐标移动/华为机试(C/C++)

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/thecentry。 https://blog.csdn.net/thecentry/article/details/82262607

题目描述

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

坐标之间以;分隔。

非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。

下面是一个简单的例子 如:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

处理过程:

起点(0,0)

+   A10   =  (-10,0)

+   S20   =  (-10,-20)

+   W10  =  (-10,-10)

+   D30  =  (20,-10)

+   x    =  无效

+   A1A   =  无效

+   B10A11   =  无效

+  一个空 不影响

+   A10  =  (10,-10)

结果 (10, -10)

输入描述:

一行字符串

输出描述:

最终坐标,以,分隔

示例1

输入

A10;S20;W10;D30;X;A1A;B10A11;;A10;

输出

10,-10

代码1:


//第十七题 坐标移动
#include <iostream>
#include <string>
#include <cstddef>
#include<vector>
using namespace std;
int main()
{
	string inStr;
	while (cin >> inStr)
	{
		int iPosition1 = 0;
		int iPosition2 = 0;
		size_t fPosition = 0;
		vector<string>tMove;
		while ((fPosition = inStr.find(';')) != string::npos)
		{
			string temp(inStr.substr(0, fPosition));
			if (temp.length() > 3 || temp.length() < 2)
			{
				inStr.erase(0, fPosition + 1);
				continue;
			}
			tMove.push_back(temp);
			inStr.erase(0, fPosition + 1);
		}
		int iMax = tMove.size();
		for (int i = 0; i < iMax; i++)
		{
			string dStr = tMove.at(i);
			int iLength = dStr.length();
			switch (dStr.at(0))
			{
			case 'A':
			{
				int iNum = 0;
				for (int j = 1; j < iLength; j++)
				{
					if (isdigit(dStr.at(j)))
					{
						iNum = iNum * 10 + dStr.at(j) - '0';
					}
					else
					{
						iNum = 0;
						break;
					}
				}
				iPosition1 -= iNum;
			}
			break;
			case 'D':
			{
				int iNum = 0;
				for (int j = 1; j < iLength; j++)
				{
					if (isdigit(dStr.at(j)))
					{
						iNum = iNum * 10 + dStr.at(j) - '0';
					}
					else
					{
						iNum = 0;
						break;
					}
				}
				iPosition1 += iNum;
			}
			break;
			case 'S':
			{
				int iNum = 0;
				for (int j = 1; j < iLength; j++)
				{
					if (isdigit(dStr.at(j)))
					{
						iNum = iNum * 10 + dStr.at(j) - '0';
					}
					else
					{
						iNum = 0;
						break;
					}
				}
				iPosition2 -= iNum;
			}
			break;
			case 'W':
			{
				int iNum = 0;
				for (int j = 1; j < iLength; j++)
				{
					if (isdigit(dStr.at(j)))
					{
						iNum = iNum * 10 + dStr.at(j) - '0';
					}
					else
					{
						iNum = 0;
						break;
					}
				}
				iPosition2 += iNum;
			}
			break;
			default:
				break;
			}
		}
		cout << iPosition1 << "," << iPosition2 << endl;
	}
	return 0;
}

代码2:

#include <iostream>
#include <string>
#include <cstddef>

using namespace std;

int main()
{
	string str;
	while (cin >> str)
	{
		pair<int, int> point(0, 0);
		size_t found = str.find_first_of(';');
		int start = 0;
		while (found != str.npos)
		{
			string s1 = str.substr(start, found - start);
			start = found + 1;
			found = str.find_first_of(';', found + 1);

			if (s1.size() >= 2 && s1.size() <= 3)
			{
				char c = s1[0];
				int invalid = 0;
				int sum = 0;
				for (int i = 1; i < s1.size(); i++)
				{
					if (s1[i] >= '0' && s1[i] <= '9')
					{
						sum = sum * 10 + (s1[i] - '0');

					}
					else
					{
						invalid = 1;
						break;
					}
				}
				if (invalid == 0)
				{
					switch (c)
					{
					case 'A':
					{
						point.first -= sum;
						break;
					}
					case 'D':
					{
						point.first += sum;
						break;
					}
					case 'W':
					{
						point.second += sum;
						break;
					}
					case 'S':
					{
						point.second -= sum;
						break;
					}
					}
				}

			}

		}
		cout << point.first << "," << point.second << endl;
	}
	return 0;

}

测试的时候本人写的代码一测试时间5毫秒。代码二7毫秒

猜你喜欢

转载自blog.csdn.net/thecentry/article/details/82262607