zoukankan      html  css  js  c++  java
  • 51nod 算法马拉松18 A 染色问题

    染色问题

    基准时间限制:1 秒 空间限制:10240 KB 分值: 40
    一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n),最终使得所有三个点构成的环(C(n,3)个不同的换)上三条边的颜色和在所有颜色中任选三种颜色的组合(C(n,3)种方案)一一对应,由你来给出染色方案。
    本题有多组数据
     
    Input
    第一行一个整数T,表示数据组数
    接下来T行每行一个整数n,表示完全图的点数
    Output
    输出由T个部分组成
    每个部分的第一行一个整数n,表示完全图的点数
    第二行表示构造结果
    如果无解输出No solution
    否则输出n*(n-1)/2条边的起点、终点和颜色
    Input示例
    2
    4
    3
    Output示例
    4
    No solution
    3
    1 2 3 2 3 1 3 1 2

        一开始看这个题又是环又是图又是排列组合的还以为很麻烦,不过读完题发现其实没有那么复杂。题目的样例也完全不用纠结,输入3可以像样例那样输出,也完全可以按自己想的颜色输出(我的程序跑3的结果就是1 2 1 1 3 2 2 3 3,但是可以AC)。然后再找一下规律,就是两个点间染一个颜色,然后以这两个点为一个端点的线都不能再染这个颜色了,这样下来就是自己找规律看如何填颜色了。如果输入的是偶数那么无论如何都做不到这一点,所以偶数就直接输出"No solution"就好了,奇数的话再找下规律,我是先顺着填的颜色,最后填完发现颜色数量正好再观察下我画的表的规律,写出了程序。

        下面是我以输入7为例填的表格,两边表示两个点,里面的代号是这两个点间边的颜色

      1 2 3 4 5 6 7
    1 1 2 3 4 5 6
    2 1 3 4 5 6 7
    3 2 3 5 6 7 1
    4 3 4 5 7 1 2
    5 4 5 6 7 2 3
    6 5 6 7 1 2 4
    7 6 7 1 2 3 4

        填颜色的方法应该不止一种,找出来一种就好了,然后我根据我的表的规律写的代码,下面是AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int a[1005];
    
    int main()
    {
         int T;
         int n;
         int i,j;
         int k,t;
         scanf("%d",&T);
         while(T--)
         {
              scanf("%d",&n);
              cout<<n<<endl;
              if(n%2==0)
                   cout<<"No solution"<<endl;
              else
              {
                   t=1;
                   for(i=1;i<n-1;i++)
                   {
                        k=t;
                        for(j=i+1;j<=n;j++)
                        {
                             cout<<i<<" "<<j<<" "<<k<<" ";
                             k=(k+1)%n;
                             if(k==0)
                                  k=n;
                        }
                        t=(t+2)%n;
                        if(t==0)
                             t=n;
                   }
                   cout<<n-1<<" "<<n<<" "<<k<<endl;
              }
         }
         return 0;
    }
  • 相关阅读:
    初学者--bootstrap(六)组件中的字体图标----在路上(9)
    clearfix的最佳方案----在路上(22)
    css的五种属性值----在路上(21)
    float---浮动带来的影响与清除浮动带来的影响方法----在路上(20)
    form表单 ----在路上(15)
    css中常见的属性-----在路上(14)
    Linux | 管道、重定向命令
    C++ | from_string函数的写法
    C++/C | 关于char* char[] char = new char[n]
    C++内存管理 | 01 C++ memory primitives
  • 原文地址:https://www.cnblogs.com/lmhbk/p/5919633.html
Copyright © 2011-2022 走看看