P5831 求一致的奶牛的对数

思路:
设置两个二维数组,一个用来存储输入的值。在使用for循环进行遍历后,另一个用来存储对标第一行后每一行动态变化后的J的位置。再使用for循环和if语句进行位置的一致性的判断,最后手动释放动态内存。

错误总结:
1.输入时不要加\n
2.二维数组的动态分配,先分配行,再分配列
3.记得手动释放内存

# include <stdio.h>
# include <malloc.h>

int main()
{
	int n, m, i, j, k, h;
	int sum = 0;
	scanf("%d %d", &n, &m);//输入不要加\n; 
	int ** a = (int **)malloc(sizeof(int *)*n);
	int ** b = (int **)malloc(sizeof(int *)*n);//二维数组空间的分配,为行分配空间;
	
	for (i=0; i<n; i++)
	{
		a[i] = (int *)malloc(sizeof(int)*m);//为每一列分配空间; 
	}
	
	for (i=0; i<n; i++)
	{
		b[i] = (int *)malloc(sizeof(int)*m);//为每一列分配空间; 
	}
	
	for (i=0; i<n; i++)
	{
		for (j=0; j<m; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	
    for (j=0; j<m; j++)
	{
		b[0][j] = j;
		
		for (i=1; i<n; i++) 
		{
			for (k=0; k<m; k++)
			{
				if (a[0][j] == a[i][k])
				{
					b[i][j] = k;
				}
			}
		}
	}
	
	for (j=0; j<m; j++)
	{
		int cnt = 0;
		
		for (h=j+1; h<m; h++)
		{
			for (i=0; i<n; i++)
			{
			    if (b[i][j] < b[i][h])
			    {
				    cnt++;
			    }
			    
			    if (cnt == n)
		        {
		        	sum++;
		        }
			}
			
			cnt = 0;
		}
	}
	
	printf ("%d", sum);
	
	for (i=0; i<n; i++)
	{
		free(a[i]);
	}
	free(a);//手动释放动态内存; 
	
	for (i=0; i<n; i++)
	{
		free(b[i]);
	}
	free(b);
	
	return 0;
}

posted @ 2025-07-16 21:02  xinday  阅读(10)  评论(0)    收藏  举报