算法提高 判断名次

/*/*
问题描述
  某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话。(经典的开头……-_-!)得了第1名的人23,
说了假话;得了第5名的人不好意思,也说了假话;为了使求解问题简单,第3名同样说了假话。(奇数名次说假话)
输入格式
  共5行,各行依次表示A~E说的话。
  每行包含一个形如“A>=3”的名次判断,即一个大写字母+关系运算符+一个数字,不包含空格。
  大写字母A~E,关系运算<、<=、=、>=、>、!=,数字1~5。注意:等于是“=”不是“==”!
输出格式
  可能有多解,请按照字典序输出排名序列,每个解一行
  最后一行输出解的数量
样例输入
A=2
D=5
E>3
A>2
B!=1
样例输出
ACDEB
AECBD
BADCE
BCADE
BDACE
CEADB
CEBDA
7
*/

#if 1
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>  
int a , b , c , d , e ;  
void Input( char [][5] , int ) ;
void pailie(char [][6] , int *  , char [][5]) ; 
int bxt( int , int , int , int , int ) ;
int sdh( char [][5] , int , int ) ;
int panduan( char [] ) ;
int pd_tj( char ) ;
void Output( char [][6] , int ) ; 

int main(void)
{
	int xb = 0 ;  
    char ken[200][6] ; 
	char s[5][5]; 
    Input( s , 5 ) ;
    pailie( ken , & xb , s );
    Output( ken , xb ) ; 
	return 0;
}
void Output( char ken[][6] , int xb )
{
	int i , j ;
	char temp[5] ;  
    for( i = 0 ; i < xb ; i ++ )
	{  
    	for( j = i ; j < xb ; j ++ )
		{  
        	if( strcmp ( ken[i] , ken[j] ) > 0)
			{  
            	strcpy( temp , ken[i] ) ;  
            	strcpy( ken[i] , ken[j] ) ;  
            	strcpy( ken[j] , temp ) ;  
        	}  
    	}      
    }  
    for( i = 0 ; i < xb ; i ++ )
	{  
    	puts( ken[i] ) ;      
    }  
    printf( "%d\n" , xb ) ;  
}
int pd_tj(char s)
{
	if( s == 'A' )
	{
		return a;
	}
	if( s == 'B' )
	{
		return b;
	}
	if( s == 'C' )
	{
		return c;
	}
	if( s == 'D' )
	{
		return d;
	}
	if( s == 'E' )
	{
		return e;
	}
}

int panduan(char s[])
{
	if(strlen(s)==3)
	{
		if(s[1]=='=')
		{
			return pd_tj(s[0])==(s[2]-'0');
		}
		else if(s[1]=='>')
		{
			return pd_tj(s[0])>(s[2]-'0');
		}
		else
		{
			return pd_tj(s[0])<(s[2]-'0');
		}
	}
	else
	{
		if(s[1]=='>')
		{
			return pd_tj(s[0])>=(s[3]-'0');
		}
		else if(s[1]=='!')
		{
			return pd_tj(s[0])!=(s[3]-'0');
		}
		else
		{
			return pd_tj(s[0])<=(s[3]-'0');
		}
	}
}

int sdh( char s[][5] , int ren,int n)
{
	if(ren%2==0)
	{
		if(panduan(s[n]))
		{
			return 1;
		};
		return 0;
	}
	else if(ren%2==1)
	{
		if(!panduan(s[n]))
		{
			return 1;
		};
		return 0;
	}
}

int bxt(int a , int b , int c , int d , int e )
{
	if( a == b || a == c || a == d )
	{
		return 0;
	}
	if( a == e || b == c || b == d || b == e || c == d )
	{
		return 0;
	}
	if( c == e || d == e)
	{
		return 0;
	}
	return 1 ;
}

void pailie( char ken[][6] , int *xb  , char s[][5])
{
	for( a = 1 ; a < 6 ; a ++ )
	{
    	for( b = 1 ; b < 6 ; b ++ )
		{
	    	for( c = 1 ; c < 6 ; c ++)
			{
		    	for( d = 1 ; d < 6 ; d ++ )
				{
			    	for( e = 1 ; e < 6 ; e ++ )
					{
				    	if(!bxt( a , b , c , d , e ))
				    	{
				    		continue;
						}
						if(sdh( s , a , 0 ))
						{
							if(sdh( s , b , 1 ))
							{
								if(sdh( s , c ,2 ))
								{
									if(sdh( s , d ,3 ))
									{
										if(sdh( s , e , 4 ))
										{
											ken[*xb][a-1]='A';
											ken[*xb][b-1]='B';
											ken[*xb][c-1]='C';
											ken[*xb][d-1]='D';
											ken[*xb][e-1]='E';
											ken[*xb][5]='\0';
											++ * xb ;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

void Input( char zf[][5] , int n )
{
	int i ;
	for( i = 0 ; i < n ; i ++ )
	{
		gets( zf[i] ) ;
	}
}
#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值