验证四色原理
描述
验证任何一个平面存在一种着色方案,使得相连的区域颜色不同,且颜色种类不大于4;
输入
第一行输入n。第2n+1行:每行表示1n个省,相邻的省用1表示(本身不与本身相邻)。
输出
输出每种可以填色的方式
输入样例 1
7
0 1 0 0 0 0 1
1 0 1 1 1 1 1
0 1 0 1 0 0 0
0 1 1 0 1 0 0
0 1 0 1 0 1 0
0 1 0 0 1 0 1
1 1 0 0 0 1 0
输出样例 1
1 2 1 3 1 3 4 (这是其中的一种,并按字典顺序输出)
分析:对于这幅地图来说,要求是相邻颜色不同,把它填满,那么完全可以按顺序来填色;
按顺序填色优势:在search函数中寻找周边颜色时;只需搜索0~i-1号省份,不用全部都找一遍,
而且在回溯时也不用清0后面的省份颜色
要知道一个省份可以有四种颜色
#include<bits/stdc++.h>
using namespace std;
bool biao[22];
int yan[22];//各省颜色
int a[22][22];
int n;
void input(){//输入
cin>>n;
for(int i=1;i<=n;i++){
for(int k=1;k<=n;++k){
cin>>a[i][k];
}
}
}
bool search(int k,int i){ //寻找 有无相同颜色
for(int l=1;l<=i-1;l++){//填色是按顺序来的,只需寻找到I-1,因为只有前面的填过色;后面的还没有填
if(a[i][l]==1)
if(yan[l]==k)return false;
}
return true;
}void dfs(int x);
void tian(int i){
if(i>n){
for(int k=1;k<=n;k++)//输出
cout<<yan[k]<<" ";
cout<<endl;
/*for(int o=n;o>=i-1;--o){//置0
yan[o]=0;
}*/
//这里不需要置0的原因是:与上面函数对应,search找色的时候不会找后面的颜色,所以不用管
exit(0) ;//注意这里要让他停止,否则会超时
}
for(int k=1;k<=4;++k){// 1到4颜色
if(search(k,i)){//返回1则周边没有这个颜色
yan[i]=k;tian(i+1);//填再下一个
}
}
}
int main(){
input();
tian(1);
return 0;
}
exit(0):正常运行程序并退出程序;