Poj 1974 The Happy Worm(sort结构体二级排序)

原题地址

这个A了一天,也没有搞定,查不出自己代码的不过在哪,题意,思路都知道

我的代码

sort结构体的二级排序,记下,备用。。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct array
{
	int x;
	int y;
}arr;

bool cmpx(arr a, arr b) {
    if(a.x == b.x) return a.y < b.y;
    else return a.x < b.x;
}

bool cmpy(arr a, arr b) {
    if(a.y == b.y) return a.x < b.x;
    else return a.y < b.y;
}

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		arr a[140000] = {0};
		memset(&a,0,sizeof(arr));
		int m,n,k;
		int i,j,sum = 0,bleg = 0;
		scanf("%d %d %d",&m,&n,&k);
		for(i=0;i<k;i++)
		{
			scanf("%d %d",&a[i].x,&a[i].y);
		}

		sort(a,a+k,cmpx);

		/*for(i=0;i<k;i++)
		{
				printf("%d %d
",a[i].x,a[i].y);
		}
		printf("
");*/
		for(i=1;i<=n;i++)
		{
			bleg = 0;
			for(j=0;j<k;j++)
				if(i == a[j].y) { bleg = 1; break;}
			 if(bleg == 0 && m>1) sum++;
		}
		//printf("0// %d
",sum);
		for(i=1;i<=m;i++)
		{
			bleg = 0;
			for(j=0;j<k;j++)
				if(i == a[j].x) {bleg = 1;break;}
			 if(bleg == 0 && n>1) sum++;
		}
		//printf("1// %d
",sum);
		for(i=0;i<k;i++)
		{
			if(i == 0)
			{
				if(a[i].y - 1 >= 2) sum++;
			}
			if(a[i].x != a[i-1].x && i>0)
			{
				if(a[i].y - 1 >= 2) sum++;
			}
			if(a[i].x != a[i+1].x)
			{
				if(m - a[i].y >= 2) sum++;
			}
			else
			{
				if(a[i+1].x - a[i].x > 2) sum++;
			}
		}
		//printf("hang %d
",sum);
		sort(a,a+k,cmpy);

		/*for(i=0;i<k;i++)
		{
				printf("%d %d
",a[i].x,a[i].y);
		}*/

		for(i=0;i<k;i++)
		{
			if(i == 0)
			{
				if(a[i].x - 1 >= 2) sum++;
			}
			if(a[i].y != a[i-1].y && i>0)
			{
				if(a[i].x - 1 >= 2) sum++;
			}
			if(a[i].y != a[i+1].y)
			{
				if(m - a[i].x >= 2) sum++;
			}
			else if(a[i].y == a[i+1].y)
			{
				if(a[i+1].x- a[i].x > 2) sum++;
			}
			//printf("sum %d = %d
",i,sum);
		}
        printf("%d
",sum);
	}
	return 0;
}

别人正确的代码(朋友的)

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct name{
int x;
int y;
}name;
name str[140000];
int cmp(name a,name b)
{
	if(a.x!=b.x)
		return a.x<b.x;
	else
		return a.y<b.y;
}
int comp(name a,name b)
{
	if(a.y!=b.y)
		return a.y<b.y;
	else
		return a.x<b.x;
}
int main()
{
	int t,n,m;
	int sum;
	int k;
	int count;
	int i,j;
	int flat=0;
	int flat1=0;
	scanf("%d",&t);
	for(i=0;i<t;i++){
			sum=0;
			count=1;
			flat=0;
			flat1=0;
	scanf("%d %d %d",&n,&m,&k);
	for(j=0;j<k;j++){
		str[j] .x=0;
		str[j] .y=0;
		scanf("%d %d",&str[j] .x,&str[j] .y);
	}sort(str,str+k,cmp);
	str[k] .x=0;
	str[k] .y=0;
	for(j=0;j<k;j++)
	{
		if(str[j] .x!=str[j+1].x)
		{
			if(count==1)
				{
			if((str[j] .y-1)>=2)
				sum++;
			if((m-str[j] .y)>=2)
				sum++;
				count=1;
				}
		else if(count>=2)
		{
			if((str[j-count+1].y-1)>=2)
			sum++;
			if((m-str[j] .y)>=2)
			sum++;
			for(int q=(j-count+1);q<j;q++)
			{
				if((str[q+1].y-str[q] .y-1)>=2)
					sum++;
			}
			count=1;
		}
		if(m>=2)
		flat++;
		else
			flat=n;
		}
		else if(str[j] .x==str[j+1].x)
		{
			count++;
			continue;
		}
		}
		sort(str,str+k,comp);
	for(j=0;j<k;j++)
	{
		if(str[j] .y!=str[j+1].y)
		{
			if(count==1)
				{
			if((str[j] .x-1)>=2)
				sum++;
			if((n-str[j] .x)>=2)
				sum++;
				count=1;
				}
		else if(count>=2)
		{
			if((str[j-count+1].x-1)>=2)
			sum++;
			if((n-str[j] .x)>=2)
			sum++;
			for(int q=(j-count+1);q<j;q++)
			{
				if(((str[q+1].x-str[q] .x)-1)>=2)
					sum++;
			}
			count=1;
		}
		if(n>=2)
		flat1++;
		else
			flat1=m;
		}
		else if(str[j] .y==str[j+1].y)
		{
			count++;
			continue;
		}
	}
	if(k!=0)
		printf("%d
",(sum+(n-flat)+(m-flat1)));
		else{
			if(n>=2&&m>=2)
				printf("%d
",n+m);
			else if(n>=2&&m<2)
				printf("%d
",m);
			else if(n<2&&m>=2)
				printf("%d
",n);
			else
				printf("0
");
		}
	}
	return 0;
} 

百度的

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef struct name
{
	int x;
	int y;
} name;
name str[140000];
int cmp(name a, name b)
{
	if (a.x != b.x)
	{
		return a.x < b.x;
	}
	else
	{
		return a.y < b.y;
	}
}
int comp(name a, name b)
{
	if (a.y != b.y)
	{
		return a.y < b.y;
	}
	else
	{
		return a.x < b.x;
	}
}
int main()
{
	int t, n, m;
	int sum;
	int k;
	int count;
	int i, j;
	int flat = 0;
	int flat1 = 0;
	scanf("%d", &t);

	for (i = 0; i < t; i++)
	{
		sum = 0;
		count = 1;
		flat = 0;
		flat1 = 0;
		scanf("%d %d %d", &n, &m, &k);

		for (j = 0; j < k; j++)
		{
			scanf("%d %d", &str[j] .x, &str[j] .y);
		}

		sort(str, str + k, cmp);
		str[k] .x = 0;
		str[k] .y = 0;

		for (j = 0; j < k; j++)
		{
			if (str[j] .x != str[j + 1].x)
			{
				if (count == 1)
				{
					if ((str[j] .y - 1) >= 2)
					{
						sum++;
					}

					if ((m - str[j] .y) >= 2)
					{
						sum++;
					}

					count = 1;
				}
				else
					if (count >= 2)
					{
						if ((str[j - count + 1].y - 1) >= 2)
						{
							sum++;
						}

						if ((m - str[j] .y) >= 2)
						{
							sum++;
						}

						for (int q = (j - count + 1); q < j; q++)
						{
							if ((str[q + 1].y - str[q] .y - 1) >= 2)
							{
								sum++;
							}
						}

						count = 1;
					}

				if (m >= 2)
				{
					flat++;
				}
				else
				{
					flat = n;
				}
			}
			else
				if (str[j] .x == str[j + 1].x)
				{
					count++;
					continue;
				}
		}

		sort(str, str + k, comp);

		for (j = 0; j < k; j++)
		{
			if (str[j] .y != str[j + 1].y)
			{
				if (count == 1)
				{
					if ((str[j] .x - 1) >= 2)
					{
						sum++;
					}

					if ((n - str[j] .x) >= 2)
					{
						sum++;
					}

					count = 1;
				}
				else
					if (count >= 2)
					{
						if ((str[j - count + 1].x - 1) >= 2)
						{
							sum++;
						}

						if ((n - str[j] .x) >= 2)
						{
							sum++;
						}

						for (int q = (j - count + 1); q < j; q++)
						{
							if (((str[q + 1].x - str[q] .x) - 1) >= 2)
							{
								sum++;
							}
						}

						count = 1;
					}

				if (n >= 2)
				{
					flat1++;
				}
				else
				{
					flat1 = m;
				}
			}
			else
				if (str[j] .y == str[j + 1].y)
				{
					count++;
					continue;
				}
		}

		if (k != 0)
		{
			printf("%d
", (sum + (n - flat) + (m - flat1)));
		}
		else
		{
			if (n >= 2 && m >= 2)
			{
				printf("%d
", n + m);
			}
			else
				if (n >= 2 && m < 2)
				{
					printf("%d
", m);
				}
				else
					if (n < 2 && m >= 2)
					{
						printf("%d
", n);
					}
					else
					{
						printf("0
");
					}
		}
	}

	return 0;
}



www.cnblogs.com/tenlee
原文地址:https://www.cnblogs.com/tenlee/p/4420160.html