Is It Symmetric C/C++源码实现

/*
Is It Symmetric
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 391    Accepted Submission(s): 159

Problem Description
It is easy to see that a string of digits like 1234321 is symmetric with 4 being the central digit. However it is less obvious if we consider the string as a circular one and shift it to the left as 2343211. Your task is to write a program to check if a circular string is symmetric.
 
Input
Your program must read test cases from standard input.
The input file consists of several test cases. Each case occupies a line which contains the string. Each string contains less than 100 digits.
The input is finished by a "#".
 
Output
For each test case, your program must output to standard output. If the string is not symmetric, output "NO" in a line; else output "YES", followed by a space and the position of the center (the position index starts from 0). It is guaranteed that the length of the string is an odd number and the center is unique.
 
Sample Input
2112343
798
#
 
Sample Output
YES 5
NO

*/
#include<iostream>
#define N 10
#define LIMIT 10
using namespace std;

char TestCase[LIMIT][N];
bool Dflag = true;

int BorderFind(char array[], int length);
void CircuitLshift(char array[],int length, int digit);
void SymmetricJudge(char array[], int length, int digit);

void main()
{
	int i = 0;
	while (cin>>TestCase[i] && *TestCase[i] != '#')
	{	
		i++;
	}
	for(int n=0; n<i; n++)
	{
		int length = strlen(TestCase[n]);
		int border = BorderFind(TestCase[n], strlen(TestCase[n]));
		CircuitLshift(TestCase[n], length, border);
		SymmetricJudge(TestCase[n], length, border);
	}
}
//寻找相邻两个数相同的边界
int BorderFind(char array[], int length)
{
	int count = 0;
	int i, Tborder;
	for (i=0; i<length-1; i++)
	{
		if(array[i] == array[i+1])
		{
			Tborder = i + 1;
			count++;
		}
	}
	if(count == 1)
		return Tborder;
	if(count == 0)
	{
		Dflag = true;
		return 0;
	}
	if(count > 1)
	{
		Dflag = false;
		return 0;
	}
}

//循环左移
void CircuitLshift(char array[],int length, int digit)
{
	if(Dflag == false)
		cout<<"NO"<<endl;
	while (digit--)
	{
		char Ctemp;
		Ctemp = array[0];
		for (int i=0; i<length-1; i++)  
		{  
			array[i] = array[i+1];  
		}  
        array[length-1] = Ctemp;
	}
}

//判断测试例子是否对称
void SymmetricJudge(char array[], int length, int digit)
{
	if(Dflag == true)
	{
		for (int i=0; i<(length+1)/2; i++)
		{
			if(array[i] != array[length-i-1])
			{
				cout<<"NO"<<endl;
				break;
			}
			if(i == (length+1)/2-1)
				cout<<"YES"<<" "<<(length+1)/2+digit-1<<endl;
		}
	}
}

实验结果如下:




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值