題意:求素數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...