玲珑杯-萌萌哒的第六题

DESCRIPTION

一个凸多边形的每个角都是RGB三种颜色的其中一种,保证相邻的两个点颜色都不一样,请问是否能用多条不相交的对角线把多边形切成多个三角形,使得每个三角形的三个角颜色都不一样。
上述问题对于你来说可能比较简单,但是出题人遇到一个难题,他不会写special judge。也就是说当你把输出给出来,他不知道怎么判断是否正确,现在给出输入和输出,请你判断这个输出是否正确。

INPUT
包含多组数据(<=15),其中每组数据: 第一行一个整数表示多边形的顶点数n(4 <= n <= 1000), 接下来一行一个长度为n的只包含RGB三种字符的字符串,表示多边形每个点的颜色,相邻的字符在多边形上相信,第一和最后一个字符相邻 接下来n-3行,每行两个整数a, b(1 <= a, b <= n)表示这两个编号的点链接一条对角线,保证这两个点在多边形上不相邻。(注意:a不等于b,没有重边,即没有两对a b一样。)
OUTPUT
每组数据输出一行,"YES"表示这个答案正确,"NO"表示这个答案错误。
SAMPLE INPUT
7RBGBRGB1 33 75 75 34RGRG1 3
SAMPLE OUTPUT
YESNO

这道题也是暴力可以过的

因为数据不多,还有2S

暴力妥妥的

怪自己当时没有看这道题

思路

因为给你了n-3条边,说明了已经分割出了最多的三角形了,不可能再多哪怕一个三角形

1.对于给出的每条连线,遍历一下所有的顶点,如果有点可以组成三角形且点的颜色都不一样

那么这就是一个三角形了

2.需要注意一点是还要判断题目中给的边是否重合

判断重合还是暴力解决!两两边比较,看看是否重合

判断重合的条件看看一条边的两个顶点有没有伸到另一条边里面(注意,必须是一个顶点在里面,另一个不在里面)

引用一下大牛的代码

#include<stdio.h>  
#include<iostream>  
#include<string.h>  
using namespace std;  
struct node  
{  
    int u,v;  
}e[1050];  
int mp[1050][1050];  
int vis[1050];  
char a[1050];  
int main()  
{  
    int n;  
    while(~scanf("%d",&n))  
    {  
        memset(mp,0,sizeof(mp));  
        scanf("%s",a+1);  
        mp[n][1]=1;mp[1][n]=1;  
        for(int i=1;i<=n-1;i++)  
        {  
            mp[i][i+1]=1;  
            mp[i+1][i]=1;  
        }  
        for(int i=1;i<=n-3;i++)  
        {  
            scanf("%d%d",&e[i].u,&e[i].v);  
            mp[e[i].u][e[i].v]=1;  
            mp[e[i].v][e[i].u]=1;  
        }  
        int flag=0;  
        for(int i=1;i<=n-3;i++)  
        {  
            for(int j=1;j<=n;j++)  
            {  
                if(j!=e[i].u&&j!=e[i].v)  
                {  
                    if(mp[j][e[i].u]==1&&mp[j][e[i].v]==1)  
                    {  
                        int x=e[i].u;  
                        int y=e[i].v;  
                        int z=j;  
                        if(a[x]!=a[y]&&a[x]!=a[z]&&a[y]!=a[z])continue;  
                        else flag=1;  
                    }  
                }  
            }  
        }  
        for(int i=1;i<=n-3;i++)  
        {  
            memset(vis,0,sizeof(vis));  
            int minn=min(e[i].u,e[i].v);  
            int maxn=max(e[i].u,e[i].v);  
            int l1=minn+1;  
            int r1=maxn-1;  
            for(int j=l1;j<=r1;j++)  
            {  
                vis[j]=1;  
            }  
            for(int j=1;j<=n;j++)  
            {  
                if(vis[j]==1)continue;  
                else  
                {  
                    if(j==minn||j==maxn)continue;  
                    vis[j]=2;  
                }  
            }  
            for(int j=1;j<=n-3;j++)  
            {  
                int x=e[j].u,y=e[j].v;  
                if(vis[x]==0||vis[y]==0)continue;  
                else if(vis[x]!=vis[y])flag=1;  
            }  
        }  
        if(flag==1)printf("NO\n");  
        else printf("YES\n");  
    }  
}  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值