ZOJ 1457Prime Ring Problem

Search Problems,用Dfs做的。一開始說超時,於是把cout全都改成printf,還是超時。後來看了網上說的,把奇數去掉了,剪枝,果然不超時了。最後又是各種PE,改了半天,看了網上的代碼,才改對。這題PE我覺得應該是題目錯的吧

 

//ZOJ1457Prime Ring Problem
#include <iostream>
#include <stdio.h>
#include <memory.h>
#define DEBUG
#define MAX_NUM 20
using namespace std;

const int Prime[13] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41};
int Ring[MAX_NUM + 1] = {0}, RingPtr = 0, TotalUsed = 0;
bool isUsed[MAX_NUM + 1] = {false};

void Dfs(int max_num)
{
        bool is_prime;
        if (TotalUsed == max_num)
        {
                is_prime = false;
                for (int i = 0; i < 13; i ++)
                {
                        if (Ring[max_num - 1] + 1 == Prime[i])
                        {
                                is_prime = true;
                                break;
                        }
                }
                if (is_prime == false)
                {
                        return;
                }
                for (int i = 0; i < max_num; i ++)
                {
                        //cout << Ring[i];
                        printf("%d", Ring[i]);
                        if (i < max_num - 1)
                        {
                                //cout << " ";
                                printf(" ");
                        }
                }
                //cout << endl;
                printf("\n");
                return;
        }

        for (int i = 1; i <= max_num; i ++)
        {
                is_prime = false;
                if (isUsed[i] == true)
                {
                        continue;
                }
                for (int j = 0; j < 13; j ++)
                {
                        if (Ring[RingPtr - 1] + i == Prime[j])
                        {
                                is_prime = true;
                                break;
                        }
                }
                if (is_prime == false)
                {
                        continue;
                }
                Ring[RingPtr] = i;
                RingPtr ++;
                isUsed[i] = true;
                TotalUsed ++;
                Dfs(max_num);
                RingPtr --;
                Ring[RingPtr] = 0;
                isUsed[i] = false;
                TotalUsed --;
        }
}
int main(int argc, char *argv[])
{
        int max_num, case_num;

        case_num = 0;
        while (cin >> max_num)
        {
                case_num ++;
                //if (case_num > 1/* && max_num % 2 == 1*/)
                //{
                        //cout << endl;
                //      printf("\n");
                //}
                //cout << "Case " << case_num << ":" << endl;
                printf("Case %d:\n", case_num);
                if (max_num % 2 == 1)
                {
                        printf("\n");
                        continue;
                }
                Ring[0] = 1;
                RingPtr = 1;
                memset(isUsed, 0x00, sizeof(isUsed));
                isUsed[1] = true;
                TotalUsed = 1;
                Dfs(max_num);
                printf("\n");
        }
        return 0;
}
發佈了49 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章