PAT A1084 Broken Keyboard (20 分) +B1033(hash&&PAT中不能用gets()的解决办法)

本文深入探讨了PAT竞赛中的字符匹配算法,重点讲解了如何使用hashTable进行字符比较和筛选,通过具体代码实例,展示了如何高效地找出两行字符中,第一行存在而第二行缺失的字符,同时介绍了在PAT平台上避免使用被禁用函数的方法。

题目大意:

  • 给出两行字符,要求找出 第一行有的 && 第二行没有 的字符,每个字符按照大写输出,只输出一遍,空格也算。

注意点

  • 用到hashTable,数组下标可用ASCII对应,一般情况下设置数组大小为128

  • gets函数在PAT里不能通过编译(因为OJ把gets禁用了),可以用fgets替代,用法:

    • fgets( str1,100,stdin)
    • str1:字符串名称
    • 100:字符串最大长度
    • stdin表示键盘输入

我的代码

#include<cstdio>
#include<string>
#include<cstring>

bool hashTable[128]={false};
char str1[100],str2[100];

char aToA(char a)
{
	if(a>='a'&&a<='z')
		a-=32;
	return a;
}

int main()
{
//	gets(str1);
//	gets(str2);
//	puts(str1);
//	puts(str2);
	fgets(str1,100,stdin);
	fgets(str2,100,stdin);

	int len1=strlen(str1);
	int len2=strlen(str2);
	
	for(int i=0;i<len1;i++)
	{
		int j=0;
		char c1,c2;
		c1=aToA(str1[i]);
		for(j=0;j<len2;j++)
		{
			c2=aToA(str2[j]);
			if(c1==c2)
				break;
		}
		if(j==len2&&hashTable[c1]==false)
		{
			printf("%c",c1);
			hashTable[c1]=true;
		}
		
	}

	return 0;	
}

B1033(简要记录)
和上道题意思差不多。
str1是坏键,str2是本应该输出的字符串,求输出结果。

注意点:

  • 如果shift键(+)坏了,则所有大写字母不能输出
  • 步骤:
    • 检测str1中是否有 ‘+’,如果有,置Aflag为真
    • 将str1的字符设置为hash数组
    • 为方便str2输出,将str1中的大写字母转为小写(设置一个函数)
    • 枚举str2

我的代码:

#include<cstdio>
#include<cstring>

bool hashTable[128]={false};
const int MAXN=100010;
char str1[MAXN],str2[MAXN];

char AToa(char s)
{
	if(s>='A'&&s<='Z')
		s+=32;
		
	return s;
}

int main()
{
	fgets(str1,MAXN,stdin);
	fgets(str2,MAXN,stdin);
	int len1=strlen(str1);
	int len2=strlen(str2);
	
	//处理str1中的坏键
	bool Aflag=false;	//大写键是否坏掉 
	for(int i=0;i<len1;i++)
	{
		char c1=str1[i];
		if(c1=='+')
			Aflag=true;
		//大写转化成小写 
		c1=AToa(c1);
		hashTable[c1]=true; 
	} 
	
	//枚举str2
	for(int i=0;i<len2;i++)
	{
		char c2=str2[i];
		if(c2>='A'&&c2<='Z'&&Aflag==true)
			continue;
		c2=AToa(c2);
		if(hashTable[c2]==true)
			continue;
		else
		{
			printf("%c",str2[i]);
		}
	 } 
	
	return 0;	
}

每次游戏玩家会拿到一张彩票,上面会有 9 个数字,别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。 数字合计 获得金币 数字合计 获得金币 6 10,000 16 72 7 36 17 180 8 720 18 119 9 360 19 36 10 80 20 306 11 252 21 1,080 12 108 22 144 13 72 23 1,800 14 54 24 3,600 15 180 现在请你写出一个模拟程序,模拟玩家的游戏过程。 输入 输入第一部给出一张合法的彩票,即用 3 行 3 列给出 0 至 9 的数字。0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。 第二部给出玩家刮开的三个位置,为三行,每行按格式 x y 给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。 最后一部给出玩家选择的方向,即一个整数: 1 至 3 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7、8别表示左上到右下的主对角线和右上到左下的副对角线。 输出 对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。 样例输入 Copy 1 2 3 4 5 6 7 8 0 1 1 2 2 2 3 7 样例输出 Copy 1 5 6 180 提示
最新发布
01-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值