洛谷刷题C语言:远古档案馆(Ancient Archive)、VOLIM、SAHOVNICA、Tuna、KRIŽALJKA

记录洛谷刷题C语言qaq,都是些不优雅的代码


远古档案馆(Ancient Archive)

题目背景

为了揭开月光能量背后的秘密,你来到了地下的远古档案馆。

远古一族的秘密与遗忘的知识悉数贮藏于这片被尘封的迷宫中,你能成功解谜,获知远古的知识吗?

题目描述

远古档案馆的中心是一个解谜:

  • 有一个 2 × 2 2\times 2 2×2 的网格,每个格子中要么有一个正整数,要么是空的;

  • 你可以进行若干次操作:每次操作中,你选择一个有正整数的格子和一个与之相邻的空格子,将正整数移到那个空格子中;

  • 给定网格的初始状态和最终状态,保证初始状态和最终状态中包含的正整数个数相同(设为 k k k 个),且它们就是前 k k k 个不同的正整数,问是否可以通过有限次操作从初始状态到达最终状态?

下图展示了一个包含三个正整数的网格经过两次操作的情况:

只有完成解谜,才能获得遗忘的知识,因此你希望尽快解决这个问题。

注意:网格中可能没有正整数,也可能没有空格。

输入格式

输入共包括四行,每行两个整数。

前两行描述了初始状态,后两行描述了最终状态,用 0 0 0 表示空格子。

输出格式

如果可以从初始状态到达最终状态,输出 Yes,否则输出 No

样例 #1

样例输入 #1

2 1
3 0
0 2
3 1

样例输出 #1

Yes

样例 #2

样例输入 #2

2 1
4 3
3 4
2 1

样例输出 #2

No

提示

【样例 1 解释】

如题目描述中图所示。


【样例 2 解释】

没有可移动的正整数,所以无法从初始状态到达与之不相等的最终状态。


【数据范围】

本题采用捆绑测试。

所有数据符合题目描述所述。

  • Subtask 1(40 points):不存在空格。
  • Subtask 2(60 points):无特殊限制。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>


int a[5],b[5],num=0,k;

int swap(int a,int b)
{
	a = a + b;
	b = a - b;
	a - a - b;
}
int judge1(){
    if(a[1]==b[3]&&a[2]==b[4]){ //a的第一行与b的第二行相同 
        if(a[1]!=0&&a[2]!=0) return 1;
    }
    if(a[3]==b[1]&&a[4]==b[2]){ //a的第二行与b的第一行相同 
        if(a[3]!=0&&a[4]!=0) return 1;
    }
    if(a[1]==b[2]&&a[3]==b[4]){ //a的第一列与b的第二列相同
        if(a[1]!=0&&a[3]!=0) return 1;
    }
    if(a[2]==b[1]&&a[4]==b[3]){ //a的第二列与b的第一列相同 
        if(a[2]!=0&&a[4]!=0) return 1;
    }
    return 0;
}
int judge2(){
    if(a[1]==b[1]&&a[2]==b[2]){ //a的第一行与b的第一行相同 
    	if(a[1]==0||a[2]==0) return 1;
    }
    if(a[3]==b[3]&&a[4]==b[4]){ //a的第二行与b的第二行相同 
    	if(a[3]==0||a[4]==0) return 1;
    }
    if(a[1]==b[1]&&a[3]==b[3]){ //a的第一列与b的第一列相同 
    	if(a[1]==0||a[3]==0) return 1;
    }
    if(a[2]==b[2]&&a[4]==b[4]){ //a的第二列与b的第二列相同 
    	if(a[2]==0||a[4]==0) return 1;
    }
    return 0;
}
int judge3(){
    if(a[1]==b[1]&&a[4]==b[4]|| //a,b左上与右下相同 
       a[2]==b[2]&&a[3]==b[3]){ //a,b右上与左下相同 
         return 1;	
    }
    return 0;
}
int same(){ //a,b四个格完全相同 
    if(a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3]&&a[4]==b[4]) return 1;
	 return 0;
}
int move(int x){
    swap(a[k],a[x]); //x格中数字移到空格位置 
    if((judge1()||judge2()||judge3())&&!same()) return 1;
    else swap(a[k],a[x]); //判断不成立,数字回到x格
    return 0;
}
int main(){
    scanf("%d %d %d %d",&a[1],&a[2],&a[3],&a[4]);
    scanf("%d %d %d %d",&b[1],&b[2],&b[3],&b[4]);
    for(int i=1;i<=4;i++){
    	if(a[i]==0){
    		num++; //记录空格个数 
    		k=i; //记录空格出现位置 
    	}
    }
    if(same()){ //四个格全部相同
        printf("Yes"); 
        return 0;
    }
    if(num==0){ //四个格全部不为空
        printf("No"); 
        return 0;
    }
    if(num>=2){ //空格个数两个及以上 
    	printf("Yes");
    	return 0;
    }
    //以下均为只存在一个空格的情况 
    if(judge1()||judge2()||judge3()){ //判断
    	printf("No");
    	return 0;
    }
    if(k==2||k==3){ //空格位置为2或3时 
	if(move(1)||move(4)){ //判断1,4格中数字移到空格位置时 
		printf("No");
    	return 0;
		}
	}
    if(k==1||k==4){ //空格位置为1或4时
	if(move(2)||move(3)){ //判断2,3格中数字移到空格位置时  
		printf("No");
    	return 0;
		} 
	}
    printf("Yes"); //全部不成立,结束 
    return 0;
}

[COCI2013-2014#2] VOLIM

题目背景

本游戏改编自克罗地亚电视节目《我爱克罗地亚》中的游戏 I   l o v e   m y   c o u n t r y \tt{I\ love\ my\ country} I love my country

题目描述

8 8 8 个人坐成一圈,如图所示。

他们中的某一个人会拿着一个箱子,这个箱子会在比赛开始后 210 210 210 秒爆炸。

主持人会问拿箱人问题,拿箱人可以选择以下方式:

  • 若跳过或回答错误,主持人会接着问下一个问题。
  • 若回答正确,则拿箱人把箱子传递给他左手边第一个人,这个人成为新的拿箱人。

现在你知道对于每个问题,回答该问题的人所用的时间与回答情况。

给定游戏开始时拿箱人的编号与问题的数量,求出箱子爆炸时拿箱人的编号。

箱子传递时间与两个问题之间的时间忽略不计,数据保证箱子爆炸时箱子在某个人手上,且问题没有问完。

输入格式

第一行一个整数 K K K,表示游戏开始时拿箱人的编号。

第二行一个整数 N N N,表示问题的数量。

接下来 N N N 行,每行有一个整数 T T T 与一个字符,表示回答该问题的人所用的时间与回答情况:

  • 该字符为 T \tt T T,表示回答正确。
  • 该字符为 N \tt N N,表示回答错误。
  • 该字符为 P \tt P P,表示跳过。

输出格式

仅一行一个整数,即箱子爆炸时拿箱人的编号。

样例 #1

样例输入 #1

1 
5 
20 T 
50 T 
80 T 
50 T 
30 T

样例输出 #1

5

样例 #2

样例输入 #2

3 
5 
100 T 
100 N 
100 T 
100 T 
100 N

样例输出 #2

4

样例 #3

样例输入 #3

5
6
70 T
50 P
30 N
50 T
30 P
80 T

样例输出 #3

7

提示

数据规模与约定

对于 100 % 100\% 100% 的数据,有 1 ≤ K ≤ 8 1\le K\le 8 1K8 1 ≤ N , T ≤ 100 1\le N,T\le 100 1N,T100

来源

本题译自 COCI2013-2014 CONTEST 2 T1 VOLIM

按照原题数据配置,本题满分 50 50 50 分。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
    int k, n;
    scanf("%d%d",&k,&n);
    int t;
    for (int i = 1; i <= n; i++)
    {
    	int x;
    	char c;
    	scanf("%d %c",&x,&c);
    	t += x;
    	if (t >= 210)
    	{
    		printf("%d",k);
    		return 0; 
		}
		else
		{
			if (c == 'T')
			{
				if (k == 8)
				{
					k = 1;
				}
				else
				{
					k++;
				}
			}
		}
	}
	return 0;
}

[COCI2012-2013#3] SAHOVNICA

题目背景

Mirko 已经成为一个铁杆爱国者,所以他要求你给他画一个克罗地亚棋盘。

题目描述

棋盘由红色格子和白色格子组成。棋盘左上角的格子是红色。其余的格子在棋盘中交替显示成白色和红色。我们在本题中用 X 表示红色区域,用 . 表示白色区域。Mirko 的棋盘应该由 r × c r\times c r×c 的格子组成,并且每个格子是由字符 X. 组成的 a × b a\times b a×b 的字符矩阵。请你帮助他画出这个棋盘。

输入格式

输入共两行。

第一行两个整数 r , c r,c r,c,分别表示棋盘的行数和列数。
第二行两个整数 a , b a,b a,b,分别表示每个格子中的字符矩阵行数和列数。

输出格式

输出共 r × a r\times a r×a 行,每行 c × b c\times b c×b 个字符,描述最终画出来的棋盘。

样例 #1

样例输入 #1

2 4
2 2

样例输出 #1

XX..XX..
XX..XX..
..XX..XX
..XX..XX

样例 #2

样例输入 #2

5 5
2 3

样例输出 #2

XXX...XXX...XXX
XXX...XXX...XXX
...XXX...XXX...
...XXX...XXX...
XXX...XXX...XXX
XXX...XXX...XXX
...XXX...XXX...
...XXX...XXX...
XXX...XXX...XXX
XXX...XXX...XXX

提示

【数据范围】

对于所有数据, 1 ⩽ r , c , a , b ⩽ 10 1\leqslant r,c,a,b\leqslant 10 1r,c,a,b10

【题目来源】

本题来源自 COCI 2012-2013 CONTEST 3 T1 SAHOVNICA,按照原题数据配置,满分 50 50 50 分。

Eason_AC 翻译整理提供。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
	int r, c, a, b;
	scanf("%d%d",&r,&c);
	scanf("%d%d",&a,&b);
	
	for(int i = 1;i <= r;i++)
	{
		for(int y = 0;y < a;y++)
		{
			for(int j = 1;j <= c;j++)
			{
				
				if((i+j)%2 == 0)
				{
					for(int x = 0;x < b;x++)
					{
						printf("X");
					}
				}
				else
					for(int x = 0;x < b;x++)
					{
						printf(".");
					}
			}
			printf("\n");
		}
	}
	return 0;
}

[COCI2016-2017#5] Tuna

题目描述

渔夫在昨晚捕到 N N N 条金枪鱼。他准备将这些鱼卖给一个平台。

对于每一条鱼,平台会给出两个估测值 P 1 , P 2 P_1,P_2 P1,P2。如果这两个值之差不超过 X X X,则取较大的值作为该条鱼的价值;否则如果差超过 X X X,则取另一个值 P 3 P_3 P3

现在给定 N N N 条鱼的值(可能会有 2 2 2 个或 3 3 3 个),求所有鱼的总价值。

输入格式

第一行,一个整数 N N N,表示金枪鱼的数量。

第二行,一个整数 X X X

接下来的若干行分为 N N N 个部分用来表示每条鱼的信息。每部分的格式为下列二者之一:

  • 该部分仅有唯一一行,该行包含两个整数 P 1 , P 2 P_1,P_2 P1,P2
  • 该部分共有两行,第一行包含两个整数 P 1 , P 2 P_1,P_2 P1,P2,第二行包含一个整数 P 3 P_3 P3

输出格式

输出所有鱼的总价值。

样例 #1

样例输入 #1

5
2
3 4
2 1
5 3
4 4
4 2

样例输出 #1

19

样例 #2

样例输入 #2

4
2
3 5
2 8
4
6 5
6 3
7

样例输出 #2

22

样例 #3

样例输入 #3

3
10
20 50
30
20 40
50
70 20
10

样例输出 #3

90

提示

【样例 2 解释】

渔夫捕到了 4 4 4 条金枪鱼,而 X X X 的值为 2 2 2

金枪鱼编号 p 1 p_1 p1 p 2 p_2 p2 p 3 p_3 p3差值最终价值
1 1 1 3 3 3 5 5 5/ 2 ≤ 2 2 \le 2 22 5 5 5
2 2 2 2 2 2 8 8 8 4 4 4 6 > 2 6 \gt 2 6>2 4 4 4
3 3 3 6 6 6 5 5 5/ 1 ≤ 2 1 \le 2 12 6 6 6
4 4 4 6 6 6 3 3 3 7 7 7 3 ≤ 7 3 \le 7 37 7 7 7

故价值总和为 5 + 4 + 6 + 7 = 22 5+4+6+7=22 5+4+6+7=22

【数据规模与约定】

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 20 1 \le N \le 20 1N20 1 ≤ X ≤ 10 1 \le X \le 10 1X10 1 ≤ P 1 , P 2 , P 3 ≤ 100 1 \le P_1,P_2,P_3 \le 100 1P1,P2,P3100

【提示与说明】

题目译自 COCI 2016-2017 CONTEST #5 T1 Tuna

本题分值按 COCI 原题设置,满分 50 50 50

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
	int n;
	scanf("%d",&n);
	int x;
	scanf("%d",&x);
	
	long long sum  = 0;
	for(int i = 0;i < n;i++)
	{
		int a, b;
		scanf("%d%d",&a,&b);
		if(abs(a - b) > x)
		{
			int c;
			scanf("%d",&c);
			sum = sum + c;
		}
		else
		{
			if(a > b)
				sum = sum + a;
				
			else if(b >= a)
				sum = sum + b;
		}
	}
	
	printf("%ld\n",sum);
	return 0;
}

[COCI 2011/2012 #5] KRIŽALJKA

题目描述

有两个单词 A , B A,B A,B,将 A A A 水平摆放, B B B 竖直摆放,两个单词重叠部分必须为同一字母,且这一字母须在 A , B A,B A,B 中第一次出现。

例如,当 A="ABBA",B="CCBB" 时,输出如下所示:

.C..
.C..
ABBA
.B..

输入格式

一行,两个字符串,由大写字母组成,分别表示 A A A B B B

输出格式

一个矩阵,表示摆放结果。

其中无字符用 . 表示。

样例 #1

样例输入 #1

BANANA PIDZAMA

样例输出 #1

.P....
.I....
.D....
.Z.... 
BANANA
.M....
.A....

样例 #2

样例输入 #2

MAMA TATA

样例输出 #2

.T..
MAMA
.T..
.A..

样例 #3

样例输入 #3

REPUBLIKA HRVATSKA

样例输出 #3

H........
REPUBLIKA
V........
A........
T........
S........
K........
A........

提示

数据保证有解。

字符串由大写字母构成。

题目译自 COCI 2011/2012 #5 T1

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{
	char a[1001], b[1001];
	scanf("%s %s",&a,&b);
	int lena = strlen(a);
	int lenb = strlen(b);
	
	int n = 0, m = 0;
	for(n = 0;n < lena;n++)
	{
		for(m = 0;m < lenb;m++)
		{
			if(a[n] == b[m]) 
				break; 
		}
		if(a[n] == b[m]) 
			break; 			
	}
//	printf("%d %d\n",n,m);
	for(int i = 0;i < lenb;i++)
	{
		for(int j = 0;j < lena;j++)
		{
			if(j == n)
			{
				printf("%c",b[i]);
			}
			
			else if(i == m)
			{
				printf("%c",a[j]);
			}
			else
				printf(".");
		}
		printf("\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值