#include <iostream>
using namespace std;
int main()
{
//先用一个数组储存相邻的状态
cout << "一共有几个城市" << endl;
int city_num;
cin >> city_num;
cout << "一共有几组相邻" << endl;
int num = 0;
cin >> num;
int arr[50][50] = { 0 };
for (int i = 0; i < num; i++)
{
cout << "请输入第" << i+1 << "组相邻,分别是_号和_号?" << endl;
int a, b;
cin >> a >> b;
arr[a][b] = 1;
arr[b][a] = 1;
}
int S[50];
//用栈开始存储颜色 分别用1-4入栈来表示四种不同的颜色
//首先是1入栈
for (int o = 0; o < 50; o++)
{
S[o] = 1;
}//下标从1开始
S[1] = 1;
S[2] = 2;
int i=3;
int j=1;
int k=1;
//i代表的是城市
//j代表的是颜色
//k代表的是与i城市相邻的城市
while (i <= city_num)
{
for (j = S[i]; j <= 4; j++)
{
int flag = 1;
for (k = 1; k < city_num; k++)
{
if (arr[i][k] == 1)
{
if (S[k] == j)
{
flag = 0;
break;
}
}
}
if (flag == 1)
{
S[i] = j;
i++;
break;
}
}
if (j >= 5) //也就是没有对应的j颜色匹配得了,就要让上一个城市S[i]++
{
S[i] = 1;
i = i - 1;
S[i]++;
}
}
for (i = 1; i <= city_num; i++)
{
cout << "第" << i << "个城市涂上" << S[i] << "颜色" << endl;
}
return 0;
}
思路就是当循环判断无论1-4颜色都不行,就要回溯到上一个元素加1,接着判断。