华为编程大赛——判断给定数是否满足条件

判断给定数是否满足给定条件要求

 题目描述:

1、 条件是一个字符串,其格式由数学上的“开闭区间”,"&&"和"||"组成。其格式为:[5,7]&&(6,9]||(10,20),该条件表示“大于等于5,小于等于7”并且“大于6,小于9”或者“大于10,小于20”。
2、 &&优先级高于||。

输入:

1、 字符串1:上述描述格式的条件:如[5,7]&&(6,9]||(10,20)
2、 数字:判断是否满足条件的数字:9
说明:上诉两个参数是在一行中输入的,其格式为:字符串1+空格+数字。如[1,2]||(3,4) 3

 输出:

如果满足条件,则输出1,否则0。

 样例输入:

[1,2]||(3,4] 3

2.3.5 样例输出:

0

思路:使用string类的处理函数,将大问题分割为子问题,再利用分治的方法求得。

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

int func(string str ,int num){

	string orStr("||");//首先从or出断开进行递归。

	string andStr("&&");//然后从and处断开进行递归。

	
	string::size_type startPos=0,endPos=0;
	
	if( ( endPos=str.find_first_of(orStr,startPos) )
		!=string::npos ){//若存在||符号,则将问题拆分为两个子问题。

		return
			func( str.substr(startPos,endPos-startPos), num )||
			func( str.substr(endPos+2,str.size()-endPos+2), num );
	}
	if( (endPos=str.find_first_of(andStr) )
		!=string::npos ){//若不存在||,但是存在&&符号,则仍为两个子问题。
		return
			func( str.substr(startPos,endPos-startPos), num )&&
			func( str.substr(endPos+2,str.size()-endPos+2), num );

	}

	//程序执行到这里,说明已经只有[],[),(],()四种情况了。
	
	
	
	const string::size_type n=str.size()-1;
	
	string left,right;
	
	string::size_type sep=str.find(",");
	left=str.substr(1,sep);
	right=str.substr(sep+1,n-sep-1);
	int num1=atoi(left.c_str());
	int num2=atoi(right.c_str());
	
	char head=str[0],tail=str[n-1];

	if(str[0]=='['){

		if(str[n]==']'){//[]
			return num1<=num && num<=num2;
		}else if(str[n]==')'){
			return num1<=num && num< num2;
		}

	}else if(str[0]=='('){

		if(str[n]==']'){//(]
			return num1<num && num<=num2;
		}else if(str[n]==')'){
			return num1<num && num<num2;
		}

	}
	return 0;

}


int main(){
	string str;
	int num;
	while(	cin>>str>>num)
		cout<<func(str,num)<<endl;

	return 0;
}



/*

[1,8]&&(7,11]&&[8,9)||(1,2) 8

[1,8)&&(7,11]&&[8,9)||(1,2) 8

[1,2]||(3,4] 3

[1,2]||[3,4] 3

*/


posted @ 2014-07-17 11:17  StevenSuo  阅读(257)  评论(0编辑  收藏  举报