int main()
{
CreateMGraph();//建图
for i=0 to N
flag=1;colornum=0;//颜色数量
for j=0 to n
输入颜色;颜色数组存储颜色
int Flag=0;
for k=0 to k<j
if 颜色数组中存在与当前颜色相同的,则判断错误,即Flag=1
if 颜色正确
颜色数量加一
if 颜色数量不为K,判断为错误,即flag=0
if 颜色数量正确
for j=0 to n
for k=0 to n
judge(j);//进入函数判断配色方案是否正确
if flag==0
break;//停止循环
if flag==1 输出 Yes
else 输出 No
}
void judge(int p)
{
if p遍历过 或 此时flag为0,则不再进行任何操作
else
标记p遍历过
for i=0 to n
if p与i有关联,即edges[p][i]==1
if p处颜色与i处颜色相同
flag=0 并且停止循环
else if i未遍历过
i进入函数judge进行递归
}
/*由普里姆算法改造*/
int prime(int n)
{
cost[1]=0; //初始化
for i=2 to n
cost[i]=road[1][i];
for i=1 to n
min初始为一个极大值
for j=1 to n
if 通往j的费用不为0 且 小于 min
min=cost[j];k=j;
if k!= 0
num=cost[k]+num;//记录最小费用
cost[k]=0; // 作为记录过的标志
for j=1 to n
if j未访问过 且 k到j的费用小于当前j的费用
cost[j]=coad[k][j];
else
输出 -1;flag=1;退出结束循环
if flag==0
输出最低成本
}
/*该道题主要运用狄克斯特拉算法*/
void Dijkstra(int n,int c1,int c2)
{
for i=0 to n //初始化
cost[i]=fare[c1][i];
dist[i]=city[c1][i];
visited[c1]=1;dist[c1]=0;
for i=0 to n //找出距离c1最小的点
mindis初始化为最大数值
for j=0 to n
if j点未访问过 且 j到c1的距离小于mindis
k=j;
mindis=dist[j];//更新最小距离
for j=0 to n //修改未访问过顶点的距离
if j未访问过
if k到j的距离加上此时最小距离小于j到c1的距离,改变j的数值
dist[j]=dist[k]+city[k][j];
cost[j]=cost[k]+fare[k][j];
else if 距离相同 且 所用费用小于此时总费用
cost[j]=cost[k]+fare[k][j];
}
本次题目集总分:310分
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
typedef pair<int,int>pii;
const int N = 20;
const int mod = 765431;
int n=9;
char mp[N][N]; // 原图
char opt[N][N]; // 中间图
bool vol[N][N],row[N][N]; //row[i][j] 第i行中已经有j数字,vol[i][j]第i列中已经有j数字
pii P[100];int sz; // 存储所有的未知位置
int flag;
bool check(int now,int val){ // 查询 3*3宫
pii p = P[now];
int n=(p.first-1)/3*3;
int m=(p.second-1)/3*3;
for(int i=n+1;i<=n+3;i++){
for(int j=m+1;j<=m+3;j++){
if(opt[i][j] == val+‘0‘) return false;
}
}
return true;
}
void dfs(int now){
if(flag) return ;
if(now==sz) {
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) {
if(j!=1) putchar(‘ ‘);
printf("%c",opt[i][j]);
}
puts("") ;
}
flag=1;
return ;
}
pii p = P[now];
for(int j=1;j<=9;j++){
if( !row[p.first][j] && !vol[p.second][j] && check(now,j)){
row[p.first][j]=1; vol[p.second][j]=1;
opt[p.first][p.second]=j+‘0‘;
dfs(now+1);
row[p.first][j]=0; vol[p.second][j]=0;
opt[p.first][p.second]=mp[p.first][p.second];
}
}
}
int main(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%c",&mp[i][j]);
opt[i][j]=mp[i][j];
if(mp[i][j] == ‘*‘) {
P[sz].first=i;
P[sz++].second=j;
}else {
int val=mp[i][j]-‘0‘;
vol[j][val]=1;
row[i][val]=1;
}
}
getchar();
}
flag=0;
dfs(0);
return 0 ;
}
博客指路→(https://blog.csdn.net/qq_37383726/article/details/79703157)
原文:https://www.cnblogs.com/wwwwxy128/p/9185079.html