码迷,mamicode.com
首页 > 其他好文 > 详细

题解 UVA524 【Prime Ring Problem】

时间:2018-07-08 17:14:44      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:枚举   space   c++   memset   完整   size   ble   als   条件   

一道比较简单的DFS题,信息学奥赛一本通上有完整代码,我这里在注释上讲详细一点。

#include <bits/stdc++.h>
using namespace std;

int n;
int a[20];//保存结果
bool b[20];//i这个数是否用过
int cnt = 0;//共有几组数据

bool Prime(int k){//判断是否为质数我就不讲解了 
    if(k < 2) return false; 
    if(k == 2) return true;
    for(int i = 2;i * i <= k; i++){
        if(k % i == 0) return false;
    }return true;
}

void dfs(int t){//当前搜索到了第t层
    if(t == n && Prime(a[t - 1] + a[0])){//如果已经搜满了n个数且第n个数与第一个数的和为质数,也就是连成环,那就输出方案
        for(int i = 0;i < n; i++) printf("%d%c",a[i],i == n - 1 ? \n :  );
        return;
    }
    if(t == 0) {//如果是第一个数,题目里默认开头必定是1,所以第一个数无条件进入
        a[0] = 1;
        b[1] = 1;//标记为已经用过
        dfs(t + 1);//继续搜索下一个数
        return;
    }
    for(int i = 1;i <= n; i++){//枚举所有数
        if(! b[i]){//如果还没有选过
            if(t == n - 1 && Prime(i + a[n - 1 - 1])){
                b[i] = 1; a[t] = i; dfs(t + 1); b[i] = 0;
            }
            else if(Prime(i + a[t - 1])){
                b[i] = 1; a[t] = i; dfs(t + 1); b[i] = 0;
            }
        }
    }
}

int main(){
    while(scanf("%d",&n) == 1){//有多组数据用WHILE输入
        cnt++;//数据组数 + 1
        memset(b,0,sizeof(b));//注意每次要清空有无用过数组
        printf("Case %d:\n",cnt);//由于我的输出是在dfs里就输出完成的,所以要先输出这个玩意儿
        dfs(0);//从第0个数(也就是第一个)开始DFS
    }
    return 0;
}

 

题解 UVA524 【Prime Ring Problem】

标签:枚举   space   c++   memset   完整   size   ble   als   条件   

原文地址:https://www.cnblogs.com/chloristendika/p/9280537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!