Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:跪求代码~~~In Reply To:跪求代码~~~ Posted by:Yudus at 2010-04-18 09:27:51 > 实在是测不出来了,还是WA,哪位大牛给份能AC的代码啊? 最近闲着无聊,又重写了一遍,终于AC了,没人给我代码,我自己贴出来吧。。。。。。 #include <iostream> using namespace std ; const int MAX = 1000 ; char s[MAX] ; int char_to_num( char c ){//把字符转换成数字,非法字符返回-1 if( c >= '0' && c <= '9' ){ return c - '0' ; } if( c >= 'a' && c <= 'f' ){ return c - 'a' + 10 ; } return -1 ; } int string_to_num( int base , int beg , int end ){//把字符串转换成base进制的数字,出错返回-1 int res = 0 ; for( int i = beg ; i <= end ; ++i ){ if( res > 16 ){//大于16进制的无效 return -1 ; } res += char_to_num( s[i] ) ; res *= base ; } res /= base ; if( res > 16 || res < 2 ){//大于16或小于2进制的无效 return -1 ; } return res ; } int find_scope( int beg ){//找到beg后第一个#或最大长度的位置 while( s[beg] != '#' && beg != strlen( s ) ){ ++beg ; } return beg-1 ; } bool in_scope( int num , int beg , int end ){//判断从起点到终点的字符是否在num范围内 int a[MAX] = { 0 } ; for( int i = beg ; i <= end ; ++i ){ a[i] = char_to_num( s[i] ) ; } for( int i = beg ; i <= end ; ++i ){ if( a[i] >= num ){ return false ; } } return true ; } bool first_round( void ){ int count = 0 ; for( int i = 0 ; i < strlen( s ) ; ++i ){ if( s[i] == '#' ){ ++count ; } //判断表达式是否含有非法字符 if( !( ( s[i] >= '0' && s[i] <= '9' ) || ( s[i] >= 'a' && s[i] <= 'f' ) || s[i] == '#' ) ){ return false ; } } if( count == 2 && s[0] == '#' ){//首字符不为#,也就是说#123#是错的 return false ; } if( count % 2 ){//判断#是否为偶数个 return false ; } if( count == 0 ){//没有#的情况,必须为10进制 if( !in_scope( 10 , 0 , strlen( s )-1 ) ){ return false ; } else{ return true ; } } //把第一个出现的#和最后一个#排除掉,剩下的#一定是两两挨着的! bool first_jing = false ; for( int i = 0 ; i < strlen( s )-1 ; ++i ){ if( first_jing && s[i] == '#' ){ if( !( ( s[i+1] == '#' && i+1 < strlen( s )-1 ) || ( s[i-1] == '#' && i-1 >= 0 ) ) ){ return false ; } } if( !first_jing && ( s[i] >= 'a' && s[i] <= 'f' ) ){//第一个#前的数字必须为10进制,如a#1#是非法的 return false ; } if( !first_jing && s[i] == '#' ){//标记first_jing first_jing = true ; } } return true ; } bool judge( void ){ if( !first_round() ){//先进行第一轮基本判断 return false ; } int beg = 0 ; int end = find_scope( beg ) ; int curbase = string_to_num( 10 , beg , end ) ; beg = end + 1 ; while( beg < strlen( s ) ){ if( curbase == -1 && beg != strlen( s ) - 1 ){//如果进制超出16位并且不为最后的数 return false ; } if( beg+1 < strlen( s ) && s[beg] == '#' ){//这里s[beg+1]一定也为# end = find_scope( beg+1 ) ; if( end == beg ){//如果两#之间没有数字,直接no return false ; } if( !in_scope( curbase , beg+1 , end ) ){//判断后面的数字能不能用curbase进制表示 return false ; } //更新进制 curbase = string_to_num( curbase , beg+1 , end ) ; beg = end ; } beg += 2 ; } return true ; } int main( void ){ int ncase ; cin >> ncase ; while( ncase-- ){ cin >> s ; if( judge() ){ cout << "yes" << endl ; } else{ cout << "no" << endl ; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator