• 洛谷刷题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
    • 2
    • 3
    • 4

    样例输出 #1

    Yes
    
    • 1

    样例 #2

    样例输入 #2

    2 1
    4 3
    3 4
    2 1
    
    • 1
    • 2
    • 3
    • 4

    样例输出 #2

    No
    
    • 1

    提示

    【样例 1 解释】

    如题目描述中图所示。


    【样例 2 解释】

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


    【数据范围】

    本题采用捆绑测试。

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

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

    代码如下

    #include
    #include
    #include
    #include 
    
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102

    [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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    样例输出 #1

    5
    
    • 1

    样例 #2

    样例输入 #2

    3 
    5 
    100 T 
    100 N 
    100 T 
    100 T 
    100 N
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    样例输出 #2

    4
    
    • 1

    样例 #3

    样例输入 #3

    5
    6
    70 T
    50 P
    30 N
    50 T
    30 P
    80 T
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    样例输出 #3

    7
    
    • 1

    提示

    数据规模与约定

    对于 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
    #include
    #include
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    [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
    • 2

    样例输出 #1

    XX..XX..
    XX..XX..
    ..XX..XX
    ..XX..XX
    
    • 1
    • 2
    • 3
    • 4

    样例 #2

    样例输入 #2

    5 5
    2 3
    
    • 1
    • 2

    样例输出 #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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    提示

    【数据范围】

    对于所有数据, 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
    #include
    #include
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    [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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    样例输出 #1

    19
    
    • 1

    样例 #2

    样例输入 #2

    4
    2
    3 5
    2 8
    4
    6 5
    6 3
    7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    样例输出 #2

    22
    
    • 1

    样例 #3

    样例输入 #3

    3
    10
    20 50
    30
    20 40
    50
    70 20
    10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    样例输出 #3

    90
    
    • 1

    提示

    【样例 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
    #include
    #include
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    [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..
    
    • 1
    • 2
    • 3
    • 4

    输入格式

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

    输出格式

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

    其中无字符用 . 表示。

    样例 #1

    样例输入 #1

    BANANA PIDZAMA
    
    • 1

    样例输出 #1

    .P....
    .I....
    .D....
    .Z.... 
    BANANA
    .M....
    .A....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    样例 #2

    样例输入 #2

    MAMA TATA
    
    • 1

    样例输出 #2

    .T..
    MAMA
    .T..
    .A..
    
    • 1
    • 2
    • 3
    • 4

    样例 #3

    样例输入 #3

    REPUBLIKA HRVATSKA
    
    • 1

    样例输出 #3

    H........
    REPUBLIKA
    V........
    A........
    T........
    S........
    K........
    A........
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    提示

    数据保证有解。

    字符串由大写字母构成。

    题目译自 COCI 2011/2012 #5 T1

    代码如下

    #include
    #include
    #include
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    FP7195做大功率钓鱼灯应用方案,0.1%深度无极无频闪调光调色应用,调光曲线顺滑无突兀
    【MyBatis】三、使用mybatis完成CRUD
    JS继承与原型、原型链
    电脑一直蓝屏怎么办?重装系统方法
    Vue 3的组合式API:你真的需要它吗?
    彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-用户系统EP03
    润石科技(RUNIC)汽车电子应用方案和物料选型
    xss-labs/level4
    flutter系列之:builder为构造器而生
    C# Bitmap图像通过内存保存为raw图像
  • 原文地址:https://blog.csdn.net/weixin_62529383/article/details/126619848