这个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; }