二.模糊坐标—枚举

一.题目

二.思路

①切割输入字符的()括号,并将切割后的字符循环切割为两个部分x,y
②判断x,y是否符合要求,并用list存储符合要求的情况:
   1>如果字符长度为1,不能小数点切割,直接放入list并返回,例如:0,1
   2>如果以0结尾
       不以0开头,符合要求,不能添加小数点,例如:100
        开头也为0,不符合要求
   3>如果以0开头(不以0结尾),只有一种切割方式,例如:0001->0.001
   4>其他情况,循环切割小数点,例如:123->1.23,12.3,123
③将x和y的情况枚举拼接起来则为答案

三.代码实现

#include<vector>
#include<iostream>
using namespace std;
bool ifIsYaoQu(string s) {
	//判断最后一个是否以0结尾,则不符合要求
	//例如000,并且length>1
	//length==1,例如:0是符合要求的
	if (s.at(s.length() - 1) == '0' && s.length() > 1) {
		return false;
	}
	return true;
}

vector<string> getChuLiGuo(string s) {
	vector<string> List;
	//如果第一个字符不为0,最后一个字符为0
	//例如:10
	//这种数字不能打小数点,直接放入list
	if (s.length() > 1 && s.at(s.length() - 1) == '0' && s.at(0) != '0') {
		List.push_back(s);
	}
	else {
		//判断是否符合要求
		if (ifIsYaoQu(s)) {
			//如果只有一个字符,直接放入
			if (s.length() == 1) {
				List.push_back(s);
			}
			//如果多个字符,且第一个字符为0
			//例如0001
			//这种字符只有一个打小数点方法:0.001
			else if (s.length() > 1 && s.at(0) == '0') {
				string mstr;
				mstr.append(s, 0, 1);
				mstr.append(".");
				mstr.append(s, 1, s.length() - 1);
				List.push_back(mstr);
			}
			//其余情况
			else {
				for (int j = 1; j <= s.length(); j++) {
					//mstr.append(s, 0, j)->mstr   添加   字符s从第0个点切割j个字符后的字符
					//例如:mstr.append(1234, 0, 1),mstr=1
					//      mstr.append(1234, 1, 2),mstr=23
					string mstr;
					mstr.append(s, 0, j);//小数点前半部分
					if (!(j == s.length())) {
						mstr.append(".");
						mstr.append(s, j, s.length() - 1);//小数点后半部分
					}
					List.push_back(mstr);
				}
			}
		}
	}
	return List;
}

vector<string> ambiguousCoordinates(string s) {
	vector<string> stringVector;
	//去掉括号(123)->123
	string str0=s.substr(1, s.length()-2);
	//循环切割str0,获得x,y
	//123可切割为(x=1,y=23),(x=12,y=3)
	for (int i = 1; i < str0.length(); i++) {
		string x = str0.substr(0, i);
		string y = str0.substr(i, s.length() - 1);
		//判断x,y是否符合要求,并获得符合要求的数组
		//(x=1,y=23)->xList={1},yList={2.3,23}
		//(x=12,y=3)->xList={1.2,12},yList={3}
		vector<string> xList= getChuLiGuo(x);
		vector<string> yList = getChuLiGuo(y);
		//将x,y枚举组合起来
		if (xList.size() != 0 && yList.size() != 0) {
			string str = "(";
			for (int a = 0; a < xList.size(); a++) {
				string str1 = str;
				str1.append(xList.at(a));
				str1.append(",");
				for (int b = 0; b < yList.size(); b++) {
					string str2 = str1;
					str2.append(yList.at(b));
					str2.append(")");
					stringVector.push_back(str2);
				}
			}
		}
	}
	return stringVector;
}

int main() {
	string s;
	cin >> s;
	vector<string> str=ambiguousCoordinates(s);
	cout << "[";
	for (int i = 0; i < str.size(); i++) {
		if (i == str.size() - 1) {
			cout << str.at(i);
		}
		else {
			cout << str.at(i) << ",";
		}
	}
	cout << "]";
	return 0;
}

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值