| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
看错题In Reply To:Re:no Posted by:springtty at 2005-07-21 13:07:14 > 不知道错在哪里了,本地测试都可以的,代码如下
> #include <stdio.h>
> #include <string.h>
> #define min(a,b) ((a)>(b)?(b):(a))
> #define max(a,b) ((a)>(b)?(a):(b))
>
> int Len;
> int Map[11][11];
> int Max;
> int colorOk;
> int color[11];
>
> typedef struct Point
> {
> int x,y;
> }Point;
>
> typedef struct Line
> {
> struct Point sp; //线段起点
> struct Point ep; //线段终点
> }Line,*pLine;
>
>
> int IsIntersect(pLine L1,pLine L2)
> {
> int x12,y12,x34,y34,x13,y13;
>
> y12=L1->ep.y - L1->sp.y;
> x12=L1->ep.x - L1->sp.x;
> y34=L2->ep.y - L2->sp.y;
> x34=L2->ep.x - L2->sp.x;
> x13=L2->sp.x - L1->sp.x;
> y13=L2->sp.y - L1->sp.y;
>
> if(x34*y12==x12*y34){
> if((x13*y34==y13*x34) && (x12*y13==y12*x13 ))
> return 1; //Line
> else
> return 0; //None
> }
> else
> return 2; //Intersection
> }
>
>
>
> int Cross(Line L1,Line L2)
> {
> if(L1.sp.x == L2.ep.x && L1.sp.y == L2.ep.y
> && L1.ep.x == L2.sp.x && L1.ep.y == L2.sp.y
> ||L1.sp.x == L2.sp.x && L1.sp.y == L2.sp.y
> && L1.ep.x == L2.ep.x && L1.ep.y == L2.ep.y)
> return 1;
> if(min(L2.sp.x,L2.ep.x)>=max(L1.sp.x,L1.ep.x)
> ||max(L2.sp.x,L2.ep.x)<=min(L1.sp.x,L1.ep.x)
> ||min(L2.sp.y,L2.ep.y)>=max(L1.sp.y,L1.ep.y)
> ||max(L2.sp.y,L2.ep.y)<=min(L1.sp.y,L1.ep.y))
> return 0; //快速排斥实验
>
> return IsIntersect(&L1,&L2);
> } //判断两条线段是否相交的函数
>
> int Add(char NameT[],char CountryName[][21],int L)
> {
> int i;
> int NeedCmp = 1;
> for(i=0;i<L;i++)
> if(strcmp(CountryName[i],NameT) == 0)
> {
> NeedCmp = 0;
> break;
> }
> if(NeedCmp)
> {
> strcpy(CountryName[i],NameT);
> Len++;
> }
> return i;
> }
>
>
> int ok(int vertexNumber)
> {
> int i;
> for(i=0;i<Len;i++)
> if(Map[vertexNumber][i]==1&&color[vertexNumber]==color[i])
> return 0;
> return 1;
> }
>
> void backTrack(int verNum,int verColorCount)
> {
> int i;
> if(verNum>Len)
> {
> colorOk=1;
> }
> else
> {
> for(i=1;i<=verColorCount;i++)
> {
> color[verNum-1]=i;
> if(ok(verNum-1) )
> backTrack(verNum+1,verColorCount);
> }
> }
> }
>
>
>
> int GetMinColor(Line CountryLineSet[][101],
> int CountryLineNum[])
> {
> int i,j,m,n;
> Line L1,L2;
>
> for(i=0;i<Len;i++)
> for(j=i+1;j<Len;j++)
> {
> for(m=0;m<CountryLineNum[i];m++)
> {
> L1 = CountryLineSet[i][m];
>
> for(n=0;n<CountryLineNum[j];n++)
> {
> L2 = CountryLineSet[j][n];
> int res = Cross(L1,L2) ;
> if(res == 1)
> {
> Map[i][j] = Map[j][i] = 1;
> break;
> }
> }
> }
>
> }
>
> colorOk = 0;
> int colorCount;
> for(i=1;i<=Len;i++)
> {
> colorCount=i;
> backTrack(1,i); //依次试探颜色数
> if(colorOk==1)
> {
> break;
> }
> }
> return colorCount;
> }
>
> int main()
> {
>
> char NameT[21];
> char CountryName[10][21];
> Line CountryLineSet[10][101];
>
> int i,k,n,x,y;
> int firstx,firsty;
> int firstread;
> int CountryLineNum[10],index;
> int ColorNum;
> Line L;
> Point P;
> while(1)
> {
> scanf("%d",&n);
> if(n == 0) break;
> memset(CountryName,0,10*21*sizeof(char));
> memset(CountryLineSet,0,10*101*sizeof(Line));
> memset(CountryLineNum,0,10*sizeof(int));
> memset(Map,0,11*11*sizeof(int));
>
> k = 0;
> Len = 0;
> for(i=0;i<n;i++)
> {
> scanf("%s",NameT);
> k = Add(NameT,CountryName,Len);
> firstread = 1;
>
> while(1)
> {
> scanf("%d",&P.x);
> if(P.x == -1 && !firstread)
> {
> L.sp.x = firstx;
> L.sp.y = firsty;
> L.ep.x = x;
> L.ep.y = y;
> index = CountryLineNum[k];
> CountryLineSet[k][index] = L;
> CountryLineNum[k]++;
> break;
> }
> scanf("%d",&P.y);
> if(!firstread)
> {
> L.sp.x = x;
> L.sp.y = y;
> L.ep.x = P.x;
> L.ep.y = P.y;
> index = CountryLineNum[k];
> CountryLineSet[k][index] = L;
> CountryLineNum[k]++;
> }
> else
> {
> firstx = P.x;
> firsty = P.y;
> }
>
> x = P.x;
> y = P.y;
> firstread = 0;
> }//while(1) break with -1
>
> }//read block
> ColorNum = GetMinColor(CountryLineSet,CountryLineNum);
> printf("%d\n",ColorNum);
> }
>
>
> return 0;
> }
>
> 测试数据如下:
> 6
> Blizid
> 0 0
> 60 0
> 60 60
> 0 60
> 0 50
> 50 50
> 50 10
> 0 10
> -1
> Blizid
> 0 10
> 10 10
> 10 50
> 0 50
> -1
> Windom
> 10 10
> 50 10
> 40 20
> 20 20
> 20 40
> 10 50
> -1
> Accent
> 50 10
> 50 50
> 35 50
> 35 25
> -1
> Pilot
> 35 25
> 35 50
> 10 50
> -1
> Blizid
> 20 20
> 40 20
> 20 40
> -1
> 4
> A1234567890123456789
> 0 0
> 0 100
> 100 100
> 100 0
> -1
> B1234567890123456789
> 100 100
> 100 200
> 200 200
> 200 100
> -1
> C1234567890123456789
> 0 100
> 100 100
> 100 200
> 0 200
> -1
> D123456789012345678
> 100 0
> 100 100
> 200 100
> 200 0
> -1
> 6
> A
> 0 0
> 1 0
> 1 1
> 0 1
> -1
> B
> 0 1
> 1 1
> 1 2
> 0 2
> -1
> C
> 1 1
> 2 1
> 2 2
> 1 2
> -1
> D
> 1 0
> 2 0
> 2 1
> 1 1
> -1
> A
> 1 2
> 2 2
> 2 3
> 1 3
> -1
> E
> 2 0
> 3 0
> 3 2
> 2 2
> -1
> 0
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator