A. 实验8_1_矩阵转置

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

问题描述:
任意给定一个n*m的矩阵,矩阵的行数为n,列数为m。你的任务是实现矩阵的转置,即行列互换。

输入与输出要求:
输入两个整数n、m,代表矩阵的行数与列数,n、m的范围均是1—100。然后输入n*m个整数,即此矩阵的元素。输出经过矩阵转置得到的新矩阵,新矩阵占m行,n列。每行的每个元素用空格分隔,注意最后一个数的后面为换行符。

输入样例

3 5
5 5 5 5 5
3 3 3 3 3
1 1 1 1 1

输出样例

5 3 1
5 3 1
5 3 1
5 3 1
5 3 1

示例代码

#include <stdio.h>

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int juzhen[n][m];
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &juzhen[i][j]);
        }
    }
    for (j = 0; j < m; j++)
    {
        for (i = 0; i < n; i++)
        {
            printf("%d ", juzhen[i][j]);
        }
        printf("\n");
    }
    return 0;
}

还要转置在输出。。。。。那就写过吧

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

void res(int array[][110], int n, int m);

int main()
{
	int juzhen[110][110];
    int n, m;
    scanf("%d %d", &n, &m);
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &juzhen[i][j]);
        }
    }
	res(juzhen, n, m);
	//system("pause");
    return 0;
}

void res(int array[][110], int n, int m)
{
	int reserveArray[m][n];
	int i, j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			reserveArray[i][j] = array[j][i];
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			array[i][j] = reserveArray[i][j];
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d ", array[i][j]);
		}
		printf("\n");
	}
}

B. 实验8_2_推销员的便条

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

注意这题不用输出saler和prod。

题目描述

问题描述:
某公司有四个销售员(代号1—4),负责销售五种产品(代号1—5)。每个销售员都把当天售出的每种产品各写一张便条交上来。每张便条包含销售员的代号、产品的代号、这种产品的销售额。我们搜集到了每个月的所有便条,你的任务是根据这些便条,计算出每人、每种产品的总销售额。处理完销售信息后,以表格形式打印出结果。用列代表销售员,行代表产品。每种产品的销售总额输出到该行的最右边,每个销售员的销售总额输出到该列的最下边。

输入与输出要求:
输入一个整数n,代表便条的数量,然后是n组便条的内容,每组内容包括两个整数和一个浮点数,即销售员的代号、产品的代号、这种产品的销售额。输出信息处理后的矩阵,矩阵占6行,5列,矩阵元素保留一位小数。每行的每个元素用tab分隔,注意每行最后一个数的后面为换行符。输出格式细节见样例。
特别提醒:1、输出只包含数据,不包含列表的行和列的说明,即saler1、prod1等内容。2、存储浮点数数据的二维数组用 float类型

输入样例

4
1 1 35.6
1 2 23.1
1 1 89.3
4 5 22.6

输出样例

124.9  0.0    0.0    0.0    124.9   
23.1   0.0    0.0    0.0    23.1    
0.0    0.0    0.0    0.0    0.0 
0.0    0.0    0.0    0.0    0.0 
0.0    0.0    0.0    22.6   22.6    
148.0  0.0    0.0    22.6   170.6

示例代码

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

int main()
{
    float x[6][5] = {0};
    int n;
    int saler, prod;
    float money;
    scanf("%d", &n);
    while (n--)
    {
        scanf("%d %d %f", &saler, &prod, &money);
        x[prod - 1][saler - 1] += money;
    }
    int i, j;
    for (i = 0; i < 5; i++)
    {
        float sum = 0;
        for (j = 0; j < 4; j++)
        {
            sum += x[i][j];
        }
        x[i][4] = sum; 
    }
    for (i = 0; i < 5; i++)
    {
        float sum = 0;
        for (j = 0; j < 5; j++)
        {
            sum += x[j][i];
        }
        x[5][i] = sum;
    }
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("%.1f\t", x[i][j]);
        }
        printf("\n");
    }
    return 0;
}

C. 实验8_3_设计函数

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

问题描述:
void findMin(int M[][MAX],int x[],int n,int m); 将二维数组M中每列的最小元素,依次放入一维数组x中,二维数组M的行数为n,列数为m。
输入与输出要求:
输入两个整数n、m,代表二维数组M的行数与列数,n、m的范围均是1—100。然后是n*m个整数,即二维数组M的元素。输出x数组中的元素,每个元素用空格分隔。

输入样例

3 4
22 45 56 30
19 33 45 38
20 22 66 40

输出样例

19 22 45 30

示例代码

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

#define MAX 100

void findMin(int M[][MAX],int x[],int n,int m);

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int M[n][100];
    int x[m];
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &M[i][j]);
        }
    }
    findMin(M, x, n, m);
    return 0;
}

void findMin(int M[][100],int x[],int n,int m)
{
    int i, j;
    for (j = 0; j < m; j++)
    {
        int min = M[0][j];
        for (i = 0; i < n; i++)
        {
            if (M[i][j] < min)
            {
                min = M[i][j];
            }
        }
        printf("%d ", min);
    }
}

D. 实验8_5_寻找鞍点

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

问题描述:
任意给定一个nm的矩阵,矩阵的行数为n,列数为m。你的任务是寻找该矩阵的鞍点。一个矩阵的鞍点即该位置上的元素在所在行上最大,在所在列上最小。有的矩阵也可能没有鞍点。不难证明,如果一个矩阵有鞍点,那么这个鞍点一定是唯一的。如果某个矩阵只有1行(1列),则默认该行上的所有元素满足列上最小(行上最大)的要求。
例如矩阵M:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
该矩阵的鞍点为M[0][4]=5,该数在第0行最大,在第4列最小。
注:测试用例保证同行或同列内没有相等的值。
输入与输出要求:
输入两个整数n、m,代表矩阵的行数与列数,n、m的范围均是1—100。然后输入nm个整数,即此矩阵的元素。如果找到该矩阵的鞍点则输出“The saddle point is (x,y)=v.”,x为该鞍点所在的行,y为该鞍点所在的列,v为该位置上元素的值;如果该矩阵没有鞍点,则输出“There is no saddle point in the matrix.”。

输入样例

4 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20

输出样例

The saddle point is (0,4)=5.

示例代码

这道题发现一个OJ遗漏的点

4 5
2 6 3 4 5
1 10 4 6 8
3 15 6 9 12
4 20 8 12 16
该数据不能过的代码在OJ上ac /滑稽
至于为啥,读者自己研究,错误示范在正确样例后给出
#include <stdlib.h>
#include <stdio.h>

void findandian(int x[][100], int n, int m);
int findmin(int x[][100], int n, int m, int state);

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int x[100][100];
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &x[i][j]);
        }
    }
    findandian(x, n, m);
    //system("pause");
    return 0;
}

void findandian(int x[][100], int n, int m)
{
    int i, j, flag = 1;
    int a, b;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            if (x[i][j] == findmin(x, i, m, 1))
            {
                if (x[i][j] == findmin(x, n, j, 2))
                {
                    a = i;
                    b = j;
                    flag = 0;
                }
            }
        }
    }
    if (flag)
    {
        printf("There is no saddle point in the matrix.");
    }
    else
    {
        printf("The saddle point is (%d,%d)=%d.", a, b, x[a][b]);
    }
}

int findmin(int x[][100], int n, int m, int state) //state 1 hang ,state 2 lie
{
    int min;
    if (state == 1)
    {
        min = x[n][0];
        for (int i = 0; i < m; i++)
        {
            if (x[n][i] > min)
            {
                min = x[n][i];
            }
        }
    }
    else 
    {
        min = x[0][m];
        for (int i = 0; i < n; i++)
        {
            if (x[i][m] < min)
            {
                min = x[i][m];
            }
        }
    }
    return min;
}

错!误!示!范

#include<stdio.h>
#include<stdlib.h>
void findAndian(int array[][110],int n,int m);
int judgeROWmax(int array[][110],int ROW,int m,int COLmin); 
int main()
{
	int n,m;
	int row,col;
	int array[110][110];
	scanf("%d %d",&n,&m);
	for(row=0;row<n;row++)
	{
		for(col=0;col<m;col++)
		{
			scanf("%d",&array[row][col]);
		}
	}  //逐个输入二维数组中的元素 
	findAndian(array,n,m);
	//system("pause");
	return 0;
}
void findAndian(int array[][110],int n,int m)
{
	int row,col;
	int ROW=0;  //定义每列最小值对应的行数 
	int COLmin;  //定义每列最小值的数值 
	int success=0;
	for(col=0;col<m&&success==0;col++)  //寻找每列的最小值 
	{
		COLmin=array[0][col];  //重置最小值 
		for(row=0;row<n&&success==0;row++)
		{
			if(array[row][col]<COLmin)
			{
				COLmin=array[row][col];
				ROW=row;  //找到每列最小值的所在行数 
			 } 
		}
		if(judgeROWmax(array,ROW,m,COLmin)==1)  //判断每列最小值与每行最大值是否相等 
		{
			printf("The saddle point is (%d,%d)=%d.",ROW,col,array[ROW][col]);
			success=1;
		}
	}
	if(success==0) printf("There is no saddle point in the matrix.");
} 
int judgeROWmax(int array[][110],int ROW,int m,int COLmin)
{
	int i;
	int max=0;
	for(i=0;i<m;i++)
	{
		if(array[ROW][i]>max) max=array[ROW][i];  //寻找列最小值所在行最大值 
	}
	if(max==COLmin) return 1;
	else return 0;
}

E. 实验8_6_矩阵变换

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

这题主要坑点是要按原顺序输出,所以要用冒泡或者插入,菜鸡用了选择wa了三次(爆哭)

题目描述

问题描述:
任意给定一个n*n的矩阵,矩阵的行数与列数均为n。你的任务是通过行变换,使得矩阵每行元素的平均值按递增顺序排列。如果出现有的行平均值相同的情况,则按照原顺序输出。

输入与输出要求:
输入一个整数n代表矩阵的行数(列数),n的范围是1—100。然后输入n*n个整数,即此矩阵的元素。矩阵元素的绝对值不会超过1000000。输出经过行变换后的新矩阵。每行的每个元素用空格分隔,注意最后一个元素后为换行符。

输入样例

3
5 5 5
3 3 3
1 1 1

输出样例

1 1 1
3 3 3
5 5 5

示例代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void jiaohuan(int a[], int b[], int n);
int findmin(long long int a[], int z, int n);

int main()
{
    srand(time(NULL));
    int n;
    scanf("%d", &n);
    long long int junzhi[110];
    int juzhen[110][110];
    int i, j;
    for (i = 0; i < n; i++)
    {
        long long int sum = 0;
        for (j = 0; j < n; j++)
        {
            scanf("%d", &juzhen[i][j]);
            sum += juzhen[i][j];
        }
        junzhi[i] = sum;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (junzhi[j] > junzhi[j + 1])
            {
                long long int tmp = junzhi[j];
                junzhi[j] = junzhi[j + 1];
                junzhi[j + 1] = tmp;
                jiaohuan(&juzhen[j][0], &juzhen[j + 1][0], n);
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ", juzhen[i][j]);
        }
        printf("\n");
    }
    //system("pause");
    return 0;
}

void jiaohuan(int a[], int b[], int n)
{
    int i;
    int tmp;
    for (i = 0; i < n; i++)
    {
        tmp = a[i];
        a[i] = b[i];
        b[i] = tmp;
    }
}

int findmin(long long int a[], int z, int n)
{
    int min = a[z], place = z;
    int i;
    for (i = z + 1; i < n; i++)
    {
        if (a[i] < min)
        {
            min = a[i];
            place = i;
        }
    }
    return place;
}

F. 实验8_10_蛇形矩阵

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

这题的思想和第二次机考的走迷宫是一样的。

题目描述

问题描述:
蛇形矩阵是一个n*n的矩阵,将整数1到n*n按照蛇形的顺序装入一个 n*n 的蛇形矩阵中,如样例所示分别为5阶和10阶蛇形矩阵:

输入与输出要求:
输入一个整数n,代表蛇形矩阵的阶数,n的范围是1—100。输出蛇形矩阵。每行的每个元素用空格分隔,注意最后一个数的后面为换行符。

输入样例

5
10

输出样例

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

示例代码

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

void snake(int n);

int main()
{
    int n;
    scanf("%d", &n);
    snake(n);
    //system("pause");
    return 0;
}

void snake(int n)
{
	int a[n][n], i = 0, j = 0, state = 1;//1 xia 2 youshang 3 you 4 zuoxia
    a[0][0] = 1;
	while(i < n - 1 || j < n - 1)
	{
		if(state == 1)
		{
			a[i + 1][j] = a[i][j] + 1;
			i++;
			if(j == 0)
			  state = 2;
			else if(j == n - 1)
			  state = 4;
		}
		else if(state == 2)
		{
			a[i - 1][j + 1] = a[i][j] + 1;
			i--;
            j++;
			if(i == 0 && j != n - 1)
			  state = 3;
			else if(j == n - 1)
			  state = 1;
			else
			  state = 2;
		}
		else if(state == 3)
		{
			a[i][j + 1] = a[i][j] + 1;
			j++;
			if(i == 0)
			  state = 4;
			else if(i == n - 1)
			  state = 2;
		}
		else if (state == 4)
		{
			a[i + 1][j - 1] = a[i][j] + 1;
			i++;
            j--;
			if(j == 0 && i != n - 1)
			  state = 1;
			else if(i == n - 1)
			  state = 3;
			else
			  state = 4; 
		}
	}
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
        {
            printf("%d ", a[i][j]);
        }
		printf("\n");
	}
}

G. 实验9_10_统计子串

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

注意这一题要逐个搜索,不能搜完之后就跳过。

题目描述

问题描述:
任意给定两个字符串str1与str2, str1与str2中可以包含任意字符。你的任务是统计字符串str2在str1中出现的次数。
如字符串str1为“asasasbbbasbas”,str2为“as”,则统计结果为5。注意如果字符串str1为“aaaaa”,字符串str2为“aaa”,则统计结果为3。

输入与输出要求:
输入两个长度不超过100的字符串,以换行符结束。输出统计次数,占一行。

输入样例

dhd dhdhdfg dhd dh zx67 dhd mklodhdh
dhd

输出样例

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

int main()
{
    char str1[110];
    char str2[110];
    gets(str1);
    gets(str2);
    int count = 0;
    for (int i = 0; str1[i] != '\0'; i++)
    {
        int flag = 1;
        for (int j = i; j - i < strlen(str2); j++)
        {
            if (str1[j] != str2[j - i])
            {
                flag = 0;
            }
        }
        if (flag)
        {
            count++;
        }
    }
    printf("%d\n", count);
    //system("pause");
    return 0;
}

H. 实验9_20_字符串排序

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

问题描述:
整数可以按照大小来排序,其实字符串也可进行排序。排序时需要比较字符串大小。字符串比较规则见Problem13中对于strcmp功能的描述。任意给定n个字符串,字符串中可以包含除换行符之外的任意字符。你的任务是将这n个字符串从小到大进行排序,然后输出。

输入与输出要求:
输入一个不超过200的整数n,代表待排序字符串的个数。然后输入n个字符串,每个字符串长度不会超过100,以换行符结束。输出排序后的n个字符串,每个字符串占一行。

输入样例

5
bbb
zzzzzz
aabbbccc
aaaaaa
abbbbb
3
abbbbbb
abbbbbb
aaaa

输出样例

aaaaaa
aabbbccc
abbbbb
bbb
zzzzzz
aaaa
abbbbbb
abbbbbb

示例代码

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

void sortstr(char x[][110], int n);

int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    char x[210][110];
    int i, j;
    for (i = 0; i < n; i++)
    {
        gets(x[i]);
    }
    sortstr(x, n);
    //system("pause");
    return 0;
}

void sortstr(char x[][110], int n)
{
    int i, j;
    char b[110];
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n - i - 1; j++)
        {
            if (strcmp(x[j], x[j + 1]) > 0)
            {
                strcpy(b, x[j]);
				strcpy(x[j], x[j + 1]);
				strcpy(x[j + 1], b);
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        puts(x[i]);
    }
}
分类: OJ代码