【DFS深搜】四色问题

题目

问题描述:
设有图4-11所示地图,每个区域代表一个省,区域中的数字代表省的编号,今将每个省涂上红(R),兰(B),黄(Y),白(W)四种颜色之一,使相邻的省份不同颜色,且第一种颜色必须填1。
【DFS深搜】四色问题_第1张图片
输入格式:
一个n表示省的个数,接着n行,读入关系(0表示不相邻,1表示相邻)。
输出格式:
按字典序输出方案,最后一行输出方案数。

思路

深搜,按编号搜,判断搜过的方案之中,相邻的省份的颜色有没有与目前冲突的,如果没有,继续搜。

代码

#include
#include 
using namespace std;
int n,ans=0,y[101]={0},a[101][101]={0};
//n是省份个数,ans是答案,y存方案
void q(int d){  //d是要求的省份编号
    if(d>n){              //如果搜索完了,输出
        for(int i=1;i<=n;i++)  
          printf("%d ",y[i]);
        printf("\n");
        ans++;             //答案数+1
        return;           //返回
    }
    int i,j;
    bool t;    //t是用来判断目前方案是否符合要求的
    for(i=1;i<=4;i++)
    {
        t=false;   //每次清空
        for(j=1;j<=d-1;j++) if(a[d][j]==1&&y[j]==i)                              {
        //如果前面的和它相邻且和它冲突
            t=true;
            break;
        }
        if(t==false){
            y[d]=i;  //存方案
            q(d+1);  //继续搜索
        }
    }
}
int main(){
    scanf("%d",&n);  //读入
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        scanf("%d",&a[i][j]);
    y[1]=1;   //先把第一个省份填了
    q(2);    //深搜
    printf("%d",ans);  //输出答案数
    return 0; 
}

(O-O)~ 萌新多多指教!

你可能感兴趣的:(DFS)