POJ 1129 四色问题 暴力搜索

#include <iostream> #include <algorithm> #include <string> #define N 30 #define f(i,a,b) for(i=a;i<b;i++)//简化代码 using namespace std; //图论中的染色问题,使得相邻两个节点颜色不同最少需要几种颜色 //搜索就是暴力的枚举,记住 bool maps[N][N]; int n,i,j,k,q; char ch[N]; void solve(){ //如果出现四个区域,每个区域都和其他三个邻接,试探C42次,用四种颜色 f(i,0,n) f(j,0,n) f(k,0,n) f(q,0,n) if(maps[i][j]&&maps[i][k] &&maps[i][q]&&maps[j][k] &&maps[j][q]&&maps[k][q]) { cout<<"4 channels needed."<<endl; return; } //如果有三个区域两两邻接,试探C32次,要用三种颜色 f(i,0,n) f(j,0,n) f(k,0,n) if(maps[i][j]&& maps[i][k] && maps[j][k]) { cout<<"3 channels needed."<<endl; return; } //如果存在两个区域邻接的情况,试探C22次,要用2种颜色 f(i,0,n) f(j,0,n) if(maps[i][j]) { cout << "2 channels needed." << endl; return; } //没有区域邻接 cout << "1 channel needed." << endl; } int main(){ while(cin>>n,n!=0){ memset(maps,0,sizeof(maps)); f(i,0,n){ cin>>ch; f(j,2,strlen(ch)){ maps[ch[0]-'A'][ch[j]-'A'] = 1; maps[ch[j]-'A'][ch[0]-'A'] = 1; } } solve(); } return 0; }  

你可能感兴趣的:(c,include)