算法竞赛入门经典(第2版)例题(第3章)

例题 3-1 TeX中的引号(Tex Quotes)

#include<stdio.h>
int main()
{
	int c, q = 1;
	while((c = getchar()) != EOF)
	{
		if (c == '"')
		{
			printf("%s", q ? "“" : "”");
			q = !q;
		} 
		else
			printf("%c", c);
	}
	return 0;
} 

例题 3-2 WERTYU

#include<stdio.h>
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
	int i, c;
	while ((c = getchar()) != EOF)
	{
		for (i = 1; s[i] && s[i]!=c; i++);
		if (s[i])
			putchar(s[i-1]);
		else
			putchar(c);
	}
} 

例题 3-3 回文词(Palindromes)

#include<stdio.h>
#include<string.h>
#include<ctype.h>

const char* rev = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string", "a mirrored palindrome"};

char r(char ch)
{
	if (isalpha(ch))
		return rev[ch-'A'];
	return rev[ch-'0'+25];
}

int main()
{
	char s[30];
	while (scanf("%s", s) == 1)
	{
		int len = strlen(s);
		int p = 1, m = 1;
		for (int i = 0; i < (len+1)/2; i++)
		{
			if (s[i] != s[len-1-i])
				p = 0;	//不是回文串 
			if (r(s[i]) != s[len-1-i])
				m = 0;	//不是镜像串 
		}
		printf("%s -- is %s.\n\n", s, msg[m*2+p]);
	}
	return 0;
}

例题 3-4 猜数字游戏的提示(Master-Mind Hints)

#include<stdio.h>
#define maxn 1010

int main()
{
	int n, a[maxn], b[maxn];
	int kase = 0;
	while (scanf("%d", &n) == 1 && n)	//n=0时输入结束 
	{
		printf("Game %d:\n", ++kase);
		for (int i = 0; i < n; i++)
			scanf("%d", &a[i]);
		for (;;)
		{
			int A = 0, B = 0;
			for (int i = 0; i < n; i++)
			{
				scanf("%d", &b[i]);
				if (b[i] == a[i])
					A++;
			}
			if (b[0] == 0)
				break;
			for (int d = 1; d <= 9; d++)
			{
				int c1 = 0, c2 = 0;	//统计数字d在答案序列和猜测序列中各出现多少次 
				for (int i = 0; i < n; i++)
				{
					if (a[i] == d)
						c1++;
					if (b[i] == d)
						c2++;
				}
				if (c1 < c2)
					B += c1;
				else
					B += c2;
			}
			printf("	(%d,%d)\n", A, B-A);
		}
	}	
	return 0;
}

例题 3-5 生成元(Digit Generator)

#include<stdio.h>
#include<string.h>
#define maxn 100005
int ans[maxn];
int main()
{
	int T, n;
	memset(ans, 0, sizeof(ans));
	for (int m = 1; m < maxn; m++)
	{
		int x = m, y = m;
		while (x > 0)
		{
			y += x % 10;
			x /= 10;
		}
		if (ans[y] == 0 || m < ans[y])
			ans[y] = m;
	}
	scanf("%d", &T);
	while (T--)
	{
		scanf("%d", &n);
		printf("%d\n", ans[n]);
	}
	return 0;
}

例题 3-6 环状序列(Circular Sequence)

#include<stdio.h>
#include<string.h>
#define maxn 105

//环状串s的表示法p是否比表示法q的字典序小 
int less(const char* s, int p, int q)
{
	int n = strlen(s);
	for (int i = 0; i < n; i++)
		if (s[(i+p)%n] != s[(i+q)%n])
			return s[(i+p)%n] < s[(i+q)%n];
	return 0;	//相等 
}

int main()
{
	int T;
	char s[maxn];
	scanf("%d", &T);
	while (T--)
	{
		scanf("%s", s);
		int ans = 0;
		int n = strlen(s);
		for (int i = 1; i < n; i++)
			if (less(s, i, ans))
				ans = i;
		for (int i = 0; i < n; i++)
			putchar(s[(i+ans)%n]);
		putchar('\n');
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值