zoukankan      html  css  js  c++  java
  • 四色问题

    【题目描述】

    给定一张包含N(N <= 8)个点的地图,以及地图上各点的相邻关系(0代表不相邻,1代表相邻),询问用4种颜色将地图涂色的所有方案数(要求相邻两点不能涂成相同的颜色)。

    【输入描述】

    第一行输入一个整数N,表示地图上有N个点;

    接下来N行,每行输入N个整数,每个整数为0或1,第i行、第j列的值代表了第i个点和第j个点是否相邻。

    【输出描述】

    输出一个数,表示染色的所有方案数。

    【样例输入】

    8

    0 0 0 1 0 0 1 0 

    0 0 0 0 0 1 0 1 

    0 0 0 0 0 0 1 0 

    1 0 0 0 0 0 0 0 

    0 0 0 0 0 0 0 0 

    0 1 0 0 0 0 0 0 

    1 0 1 0 0 0 0 0 

    0 1 0 0 0 0 0 0

    【样例输出】

    15552

     

    深度优先搜索+回溯:
    源代码:
    
    #include<cstdio>
    int n,ans(0),i[9];
    bool f[9][9];
    void DFS(int t)
    {
        for (int a=1;a<=4;a++) //似乎是一种染色问题的模板。
        {
            bool Flag(0);
            for (int b=1;b<=n;b++)
              if (f[t][b]&&i[b]==a)
              {
                Flag=true;
                break;
              }
            if (!Flag)
              if (t==n)
                ans++;
              else
              {
                i[t]=a;
                DFS(t+1);
                i[t]=0;
              }
        }
    }
    int main() //朴素DFS。
    {
        scanf("%d",&n);
        for (int a=1;a<=n;a++)
          for (int b=1;b<=n;b++)
            scanf("%d",&f[a][b]);
        DFS(1);
        printf("%d",ans);
        return 0;
    }

    非回溯解法:

    源代码:
    
    #include<cstdio>
    int n,ans(0),i[9];
    bool f[9][9];
    void DFS(int t)
    {
        for (i[t]=1;i[t]<=4;i[t]++) //值得借鉴。
        {
            bool Flag(0);
            for (int a=1;a<=n;a++)
              if (f[t][a]&&i[t]==i[a])
              {
                Flag=true;
                break;
              }
            if (!Flag)
              if (t==n)
                ans++;
              else
                DFS(t+1);
        }
    }
    int main()
    {
        scanf("%d",&n);
        for (int a=1;a<=n;a++)
          for (int b=1;b<=n;b++)
            scanf("%d",&f[a][b]);
        DFS(1);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    如何较为方便的在GMap.Net中实现车辆运行轨迹
    WPF中在摄像头视频上叠加控件的解决方案
    Image Perimeters
    [DFS]排队(间隔排列)-C++
    稀疏图判定
    兔子问题(Rabbit problem)
    YCOJ过河卒C++
    洛谷P1076 寻宝
    P1993 小K的农场(差分约束)
    大Jump!
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5902843.html
Copyright © 2011-2022 走看看