質數填表問題的回溯演算法
//質數填表問題處理標頭檔案
//質數填表問題的回溯演算法
/*
作者:成曉旭
時間:2001年10月9日(15:00:38-16:00:00)
內容:完成質數填表問題的回溯演算法
===================================================
問題描述:
在9(3*3)個方格的方陣中填入數字1-N(N>=10)內的某9個數字,
每個方格填一個整數,使所有相鄰兩個方格內的兩個整數之和為質
數.
程式設計思想:
{
int m=8,ok=1;
int n=8;
do
{
if(ok)
{
if(m==n)
{
輸出解;
調整;
}
else
擴充套件; //向前試探
}
else
調整; //向後回溯
ok = 檢查前m個整數填寫的合理性
}while(m!=0)
}
*/
#include "stdlib.h"
#define MAXN 100
#define N 12
int pnumber[MAXN];
int flag[N+1];
int checkMatrix[][3] = {{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};
//顯示輸入填寫的數字
void PrintSetPrimeNumber(int array[])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%4d",array[3*i+j]);
printf(" ");
}
scanf("%*c");
}
//判斷自然數是否是質數
int IsPrimeNumber(int m)
{
int i;
int primes[] = {2,3,5,7,11,13,17,19,23,29,-1};
if((m == 1) || (m % 2 == 0)) return(0); /*非質數*/
for(i=0;primes[i]>0;i++)
if(m == primes[i]) return(1); /*質數*/
for(i=3;i*i <=m;)
{
if(m % i == 0) return(0); /*非質數*/
i+=2;
}
return(1); /*質數*/
}
//選擇下一個要試探填寫的自然數
int SelectNumber(int start)
{
int i;
for(i=start;i<=N;i++)
if(flag[i]) return(i);
return(0);
}
//查測當前位置的插入資料是否合理
int Check(int pos)
{
int i,j;
if(pos < 0) return(0);
for(i=0;((j=checkMatrix[pos][i]) >=0);i++)
if(!IsPrimeNumber(pnumber[pos] + pnumber[j])) return(0);
return(1);
}
int Extend(int pos)
{
pnumber[++pos] = SelectNumber(1);
flag[pnumber[pos]] = 0;
return(pos);
}
int Change(int pos)
{
int j;
while((pos >= 0) && (j = SelectNumber(pnumber[pos]+1)) == 0)
flag[pnumber[pos--]] = 1;
if(pos<0) return(-1);
flag[pnumber[pos]] = 1;
pnumber[pos] = j;
flag[j] = 0;
return(pos);
}
void Find()
{
int ok = 1,pos = 0;
pnumber[pos] = 1;
flag[pnumber[pos]] = 0;
do
{
if(ok)
{
if(pos == 8)
{
PrintSetPrimeNumber(pnumber); /*輸入填寫結果*/
pos = Change(pos); /*調整下一個將填入的自然數*/
}
else
pos = Extend(pos); /*擴充套件填寫範圍<試探>*/
}
else
pos = Change(pos); /*調整下一個將填入的自然數<回溯>*/
ok = Check(pos);
}while(pos>=0);
}
//質數填表問題的回溯演算法
/*
作者:成曉旭
時間:2001年10月9日(15:00:38-16:00:00)
內容:完成質數填表問題的回溯演算法
===================================================
問題描述:
在9(3*3)個方格的方陣中填入數字1-N(N>=10)內的某9個數字,
每個方格填一個整數,使所有相鄰兩個方格內的兩個整數之和為質
數.
程式設計思想:
{
int m=8,ok=1;
int n=8;
do
{
if(ok)
{
if(m==n)
{
輸出解;
調整;
}
else
擴充套件; //向前試探
}
else
調整; //向後回溯
ok = 檢查前m個整數填寫的合理性
}while(m!=0)
}
*/
#include "stdlib.h"
#define MAXN 100
#define N 12
int pnumber[MAXN];
int flag[N+1];
int checkMatrix[][3] = {{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};
//顯示輸入填寫的數字
void PrintSetPrimeNumber(int array[])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%4d",array[3*i+j]);
printf(" ");
}
scanf("%*c");
}
//判斷自然數是否是質數
int IsPrimeNumber(int m)
{
int i;
int primes[] = {2,3,5,7,11,13,17,19,23,29,-1};
if((m == 1) || (m % 2 == 0)) return(0); /*非質數*/
for(i=0;primes[i]>0;i++)
if(m == primes[i]) return(1); /*質數*/
for(i=3;i*i <=m;)
{
if(m % i == 0) return(0); /*非質數*/
i+=2;
}
return(1); /*質數*/
}
//選擇下一個要試探填寫的自然數
int SelectNumber(int start)
{
int i;
for(i=start;i<=N;i++)
if(flag[i]) return(i);
return(0);
}
//查測當前位置的插入資料是否合理
int Check(int pos)
{
int i,j;
if(pos < 0) return(0);
for(i=0;((j=checkMatrix[pos][i]) >=0);i++)
if(!IsPrimeNumber(pnumber[pos] + pnumber[j])) return(0);
return(1);
}
int Extend(int pos)
{
pnumber[++pos] = SelectNumber(1);
flag[pnumber[pos]] = 0;
return(pos);
}
int Change(int pos)
{
int j;
while((pos >= 0) && (j = SelectNumber(pnumber[pos]+1)) == 0)
flag[pnumber[pos--]] = 1;
if(pos<0) return(-1);
flag[pnumber[pos]] = 1;
pnumber[pos] = j;
flag[j] = 0;
return(pos);
}
void Find()
{
int ok = 1,pos = 0;
pnumber[pos] = 1;
flag[pnumber[pos]] = 0;
do
{
if(ok)
{
if(pos == 8)
{
PrintSetPrimeNumber(pnumber); /*輸入填寫結果*/
pos = Change(pos); /*調整下一個將填入的自然數*/
}
else
pos = Extend(pos); /*擴充套件填寫範圍<試探>*/
}
else
pos = Change(pos); /*調整下一個將填入的自然數<回溯>*/
ok = Check(pos);
}while(pos>=0);
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935664
相關文章
- 國際象棋“皇后”問題的回溯演算法演算法
- 回溯問題
- 從八皇后問題到回溯演算法演算法
- 【經典演算法問題】馬的遍歷【回溯】演算法
- 【LeetCode回溯演算法#08】遞增子序列,鞏固回溯演算法中的去重問題LeetCode演算法
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- 求自然數的組合數的回溯演算法演算法
- c++迷宮問題回溯法遞迴演算法C++遞迴演算法
- 使用回溯演算法解決N皇后問題以及間隔排列問題演算法
- 刷題總結——回溯演算法演算法
- leetcode.回溯演算法能解決什麼問題?LeetCode演算法
- 回溯演算法求解橋本分數式演算法
- 回溯法求迷宮問題
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- ”回溯演算法“框架及練習題演算法框架
- 回溯演算法演算法
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- poj 1321 棋盤問題 回溯 JavaJava
- 回溯法解決迷宮問題
- 回溯法解決喝酒問題 (轉)
- 回溯問題Python框架總結——排列組合問題Python框架
- 演算法-回溯演算法演算法
- 【力扣】排列問題(回溯法)(去重)力扣
- 分治演算法-眾數問題演算法
- [演算法之回溯演算法]演算法
- 試題 演算法提高 質數2(C語言)演算法C語言
- 求素數(質數)演算法演算法
- 回溯法解決全排列問題總結
- C#資料結構與演算法系列(十四):遞迴——八皇后問題(回溯演算法)C#資料結構演算法遞迴
- 回溯法(排列樹)解決八(N)皇后問題
- (UVA - 208)Firetruck(路徑輸出問題,回溯+並查集/floyd演算法+dfs)並查集演算法
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- 常用演算法之回溯法演算法
- “大整數階乖”問題的遞推演算法演算法
- Java處理正則匹配卡死(正則回溯問題)Java
- (回溯法)解決一系列組合問題
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- C++搜尋與回溯演算法之Lake Counting(數湖)C++演算法