#include<iostream> #define NUM 5 using namespace std; bool ok(int i,int b[],int a[NUM][NUM]) { for(int j=0;j<i;j++) if(a[i][j]==1&&b[i]==b[j]) return false; return true; } void backtrackcoloring(int i,int vertexnum,int &sum,int a[NUM][NUM]) { int n=vertexnum; int *b=new int[n]; if(i>n) sum++; else { for(int j=0;j<4;j++) { b[i]=j; if(ok(i,b,a)) backtrackcoloring(i+1,vertexnum,&sum,a); } } } int main() { int sum=0; int m,n; int a[NUM][NUM]; int linenum=8; int vertexnum=5; for(int i=0;i<NUM;i++) for(int j=0;j<NUM;j++) { a[i][j]=0; a[j][i]=0; } for(i=0;i<8;i++) { cin>>m>>n; a[m][n]=1; a[n][m]=1; } backtrackcoloring(0,vertexnum,&sum,a); cout<<sum<<endl; return 0; }
枚举遍历法...还以为是基于dfs遍历的
ps:手机编辑,排版不好...
原文:http://m.blog.csdn.net/article/details?id=26163067
下面的这个与上面的思路一样,代码是非递规的,虽然代码比较锉,可以看看作为参考。