poj3126 埃式篩法 bfs

2021-08-09 08:55:45 字數 1736 閱讀 8043

題意:求素數a變換到素數b的最小步數,每次只能更改一位,且更改後的數也是素數。每次輸入的兩個素數都是4位數。

解法一:利用埃式篩法打表,用陣列記錄素數,把所有素數放在乙個陣列中,然後在這個陣列的基礎上進行bfs。

解法二:打表記錄每個數的素數性質,然後將a的每一位依次改變,進行bfs,前面的打表在bfs中作為乙個判斷條件。

解法一**:

/*

@filename: test.cpp

@version: 1.0

@author: wyl6

@email: [email protected]

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define inf 0x3f3f3f3f

#define maxn 10000

typedef long long ll;

typedef pairpa;

int p;

int prime[maxn];

bool is_prime[maxn];

bool used[maxn];

bool change(int x,int y)

if(i == 3) return true;

return false;

}void bfs(int s,int end)

used[i] = true;

que.push(pa(i,e.second+1));}}

}printf("impossible\n");

}int main()

}int n;

cin >> n;

while(n--)

if (s == end) printf("0\n");

else bfs(s,end);

}return 0;

}

解法二**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;  

#define maxn 10000

typedef pairpa;

bool is_prime[maxn];

int used[maxn];

void bfs(int s,int end)

if (is_prime[sum] && !used[sum])}}

}printf("impossible\n");

}int main()

}int n;

scanf("%d",&n);

while(n--)

return 0;

}

p.s.

易錯點一:埃式篩法時忘了考慮陣列邊界,越界造成runtime error

易錯點二:初始化問題

易錯點三:迴圈的上下界

poj 3126 容器 素數篩法

主要路徑 時間限制 1000ms 記憶體限制 65536 k 共提交 22998 接受 12745 描述 它是乙個不時改變這樣的事情,為了不讓敵人在黑暗中的安全問題。但你看,我選擇了我的號碼 1033年很好的理由。我是總理,你知道 我知道,所以你的新號碼 8179 也是乙個素數。你將不得不在你辦公室...

POJ3126 素數路徑(BFS)

每日打卡 1 1 題目大意 輸入乙個素數,變換到另乙個素數,但期間一次只能改變乙個數字,並且改變量字後的數依然是素數。題解 主體是bfs,先用尤拉篩法把素數表打出來,然後依次修改每一位數,判斷修改後的數是否為素數。include include include include include inc...

POJ 3126 題解 數論素數篩 搜尋

有乙個四位的素數s,每次改變一位,變成另外乙個素數t 要求每次改變後的數還是素數 最少需要改變幾次 time 1000 ms memory 65536 kb 素數篩 先篩出1e5以內的素數 然後bfs搜尋,搜尋改變任意一位後的素數 include include include include in...