算法设计课思考题;矩阵着色;回溯算法;抽象成图;

#include <iostream> using namespace std; typedef struct { char *vex;//矩阵命名 int **edge;//矩阵联系 int num;//矩阵数量 }Graph; class ColorMatrix { private: Graph graph;//矩阵图形描述 int *color;//可以填涂的颜色 int *getColor;//getColor[1:graph.num]表示 第i个顶点的颜色 int numOfColor;//可以填涂颜色数量 int count;//记录不同的着色方案总数 public: //构造函数 ColorMatrix(int num,int numOfColor)//传入矩阵数量,可涂颜色, { graph.num=num; this->count=0; this->numOfColor=numOfColor; this->color=new int[numOfColor+1];//color[1:numOfColor] graph.vex=new char [num+1];//vex[1:num] graph.edge=new int* [num+1];//edge [1:num][1:num] getColor=new int[graph.num+1];// getColor[1:graph.num] for(int i=0;i<=num;i++) { graph.edge[i]=new int [num+1]; getColor[i]=-1;//初始化每个顶点着色为-1,表示没有被着色 } for(int i=1;i<=numOfColor;i++) { color[i]=i;//对每种颜色分配一个数字对应 } } //输入所有矩阵的信息 void input() { int flag; cout<<"依次输入"<<graph.num<<"个矩阵的命名,例如:(A,B,C,D,E):"<<endl; for(int i=1;i<=graph.num;i++) { cout<<"输入第"<<i<<"个矩阵的命名:"; cin>>graph.vex[i]; } cout<<"下面输入矩阵之间的联系,请根据提示输入,如果两个矩阵有联系则输入1,否则输入0"<<endl; for(int i=1;i<=graph.num;i++) { for(int j=i+1;j<=graph.num;j++) { cout<<"输入"<<graph.vex[i]<<"与"<<graph.vex[j]<<"之间的联系:"; cin>>flag; graph.edge[i][j]=flag; graph.edge[j][i]=flag; } } } //回溯解决着色,决策为color[1 to numOfColor] void colorMatrix(int i)//表示对第i个顶点做出决策 { //如果1....graph.num个顶点全部着色完毕,那么计数加1 if(i>graph.num) { ++count; return; } for(int j=1;j<=numOfColor;j++) { getColor[i]=color[j];//给i顶点着色color[j] if(same(i,j)==false)//如果邻接点没有同样的颜色 { colorMatrix(i+1);//就给下一个顶点着色 } } getColor[i]=-1;//返回上一层时恢复该顶点为为着色状态 } //检测顶点i的邻接顶点是否拥有j颜色 bool same(int i,int j) { for(int k=1;k<=graph.num;k++) { if(i!=k&&graph.edge[i][k]==1&&getColor[k]==color[j]) { return true; } } return false; } //调用回溯算法解决问题 void colorSolve() { colorMatrix(1);//从顶点1开始着色 cout<<"有"<<count<<"种着色方案" <<endl; } }; void main() { ColorMatrix test(3,2);//3个矩形,2种颜色 test.input();//输入信息 test.colorSolve();//解决着色问题 }

你可能感兴趣的:(算法设计课思考题;矩阵着色;回溯算法;抽象成图;)