poj 3414解題報告(廣搜題)
摘要: 郁悶那,寫了七個小時,一直在調試錯誤了!fuck it! 這個與別的BFS題的主要不同是要記錄正確順序的路徑,我用path[i][j] = {way,a,b}表示狀態(i,j)是由狀態(a,b)經過方式way(一共六種... 閱讀全文
posted @ 2009-03-08 18:40 WORM 閱讀(1676) | 評論 (5) | 編輯 收藏
隨筆 - 5, 文章 - 2, 評論 - 10, 引用 - 0
|
||
poj 3414解題報告(廣搜題)
摘要: 郁悶那,寫了七個小時,一直在調試錯誤了!fuck it! 這個與別的BFS題的主要不同是要記錄正確順序的路徑,我用path[i][j] = {way,a,b}表示狀態(i,j)是由狀態(a,b)經過方式way(一共六種... 閱讀全文
posted @ 2009-03-08 18:40 WORM 閱讀(1676) | 評論 (5) | 編輯 收藏 poj 3191解題報告The Moronic Cowmpouter
Description Inexperienced in the digital arts, the cows tried to build a calculating engine (yes, it's a cowmpouter) using binary numbers (base 2) but instead built one based on base negative 2! They were quite pleased since numbers expressed in base −2 do not have a sign bit.
You know number bases have place values that start at 1 (base to the 0 power) and proceed right-to-left to base^1, base^2, and so on. In base −2, the place values are 1, −2, 4, −8, 16, −32, ... (reading from right to left). Thus, counting from 1 goes like this: 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001, and so on. Eerily, negative numbers are also represented with 1's and 0's but no sign. Consider counting from −1 downward: 11, 10, 1101, 1100, 1111, and so on. Please help the cows convert ordinary decimal integers (range -2,000,000,000..2,000,000,000) to their counterpart representation in base −2. Input Line 1: A single integer to be converted to base −2
Output Line 1: A single integer with no leading zeroes that is the input integer converted to base −2. The value 0 is expressed as 0, with exactly one 0.
Sample Input -13 Sample Output 110111 Hint Explanation of the sample:
題目的意思就是讓你把一個數轉換為-2進制,Reading from right-to-left: 1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13 基本原理: 如果n為奇數,那么末位肯定為1,因此就可以轉為求(x-1)/-2 的子問題了! (除以-2可以類比十進制就能理解了) 如果n為偶數,末位必為0,然后再轉為求x/-2的子問題; 結束條件當 n=1。 思路很簡單,但是有兩個小方面要提提,一定要考慮n=0的情況,我就是沒考慮而一直超時,郁悶,還找不出錯誤,陷入了死循環怪不得超時,還有注意球的結果是逆序的!!呵呵下面是代碼: 1
//============================================================================2 // Name : poj 3191.cpp3 // Author : worm4 // Copyright : Your copyright notice5 // Description :把一個十進制的數轉換為-2進制的數6 //============================================================================7 ![]() 8 #include <iostream>9 #include <stdio.h>10 #include <string>11 #include <math.h>12 using namespace std;13 string a= "";14 ![]() int main() {15 int x;16 cin >> x;17 ![]() if (x == 0) {18 cout <<"0"<<endl;19 return 0;20 }21 ![]() 22 ![]() while (x != 1) {23 ![]() if (abs(x) % 2 == 1) {24 a += '1';25 x = (x-1)/-2;26 continue;27 }28 a += '0';29 x /= -2;30 }31 cout <<"1";32 ![]() for (int i = a.length() - 1; i >= 0; i--) {33 printf("%c",a[i]);34 }35 ![]() 36 return 0;37 }38 ![]() posted @ 2009-03-08 12:37 WORM 閱讀(1174) | 評論 (1) | 編輯 收藏 poj 3126 Prim Path 第一道BFS
對于一個四位數,對于它某一位變化之后的素數,即“相鄰的素數”,進行廣度搜索,知道搜索到為止!
挺簡單,看代碼應該可以看懂,下面是代碼 9
#include <iostream>10 #include <queue>11 #include <math.h>12 using namespace std;13 int a, b;14 ![]() int p[9999] = { 0 };15 ![]() int visited[9999] = { 0 };16 ![]() bool isprime(int x) {17 ![]() 18 ![]() for (int i = 2; i <= sqrt((double) x); ++i) {19 if (x % i == 0)20 return false;21 }22 return true;23 }24 ![]() int BFS(int s, int r) {25 queue<int> q;26 q.push(s);27 p[s] = 0;28 visited[s] = 1;29 ![]() while (!q.empty()) {30 int temp = q.front();31 q.pop();32 ![]() for (int i = 0; i <= 9; i++) {33 int y1 = (temp / 10) * 10 + i;34 ![]() if (isprime(y1) && !visited[y1]) {35 q.push(y1);36 p[y1] = p[temp] + 1;37 visited[y1] = 1;38 }39 int y2 = temp % 10 + (temp / 100) * 100 + i * 10;40 ![]() if (isprime(y2) && !visited[y2]) {41 q.push(y2);42 p[y2] = p[temp] + 1;43 visited[y2] = 1;44 }45 int y3 = temp % 100 + (temp / 1000) * 1000 + 100 * i;46 ![]() if (isprime(y3) && !visited[y3]) {47 q.push(y3);48 p[y3] = p[temp] + 1;49 visited[y3] = 1;50 }51 ![]() if (i != 0) {52 int y4 = temp % 1000 + i * 1000;53 ![]() if (isprime(y4) && !visited[y4]) {54 q.push(y4);55 p[y4] = p[temp] + 1;56 visited[y4] = 1;57 }58 }59 if (visited[r])60 return p[r];61 }62 ![]() 63 }64 return 0;65 }66 ![]() int main() {67 int n;68 cin >> n;69 ![]() while (n--) {70 memset(visited,0,sizeof(visited));71 memset(p,0,sizeof(p));72 cin >> a >> b;73 cout << BFS(a, b) << endl;74 ![]() 75 }76 return 0;77 }78 ![]() posted @ 2009-03-08 10:36 WORM 閱讀(1350) | 評論 (1) | 編輯 收藏 第一道廣度搜索BFS紀念 poj 3278 源代碼
參考了別人的思路,做出了第一道BFS,雖然在大牛們看來不屑一顧,but about me,I really happy for it, I'm coming ! worm never give up!!
1
//============================================================================2 // Name : poj.cpp3 // Author :4 // Version :5 // Copyright : Your copyright notice6 // Description : Hello World in C++, Ansi-style7 //============================================================================8 ![]() 9 #include <iostream>10 #include <queue>11 using namespace std;12 queue<int> q;13 int result[100001];14 ![]() int visited[100001] = {0};15 ![]() int BFS(int start,int end) {16 if (start == end)17 return 0;18 q.push(start);19 result[start] = 0;20 visited[start] = 1;21 ![]() while(!q.empty()) {22 int temp = q.front();23 q.pop();24 int next;25 ![]() for (int i = 0; i < 3; ++i) {26 if (i == 0)27 next = temp - 1;28 if (i == 1)29 next = temp + 1;30 if (i == 2)31 next = temp*2;32 ![]() if(next > 100000 || next < 0) {33 continue;34 }35 ![]() if (visited[next] != 1) {36 q.push(next);37 result[next] = result[temp] + 1;38 visited[next] = 1;39 }40 if (next == end)41 return result[next];42 }43 }44 return 0;45 }46 ![]() int main() {47 int n,k;48 cin >> n >> k;49 cout << BFS(n,k) << endl;50 return 0;51 }52 ![]() posted @ 2009-03-07 18:31 WORM 閱讀(1316) | 評論 (3) | 編輯 收藏 poj 3705解題思路及源代碼 1
//============================================================================2 // Name : poj.cpp3 // Author :4 // Version :5 // Copyright : Your copyright notice6 // Description : 題目大意就是將正序數列1,2,3, ,n,通過最少的“復制粘貼”數7 // 變為逆序序列的問題。8 //基本思想: 如果n為奇數,假設n = 7;9 // 1 2 3 4 5 6 7 將n左邊的最中間的兩個數依次移到7的右邊10 // 1 2 5 6 7 3 4 的最中間11 // 1 6 7 3 2 5 412 // 7 3 2 1 6 5 4 將 3 2 1與 6 5 4 交換13 // 7 6 5 4 3 2 114 //總的次數為(n+1)/2;15 // n = 偶數時,可以先把n不管,這樣n-1就為奇數的情況,求出后的序列在和n交換一下16 //即可,結果為n/2 + 1;17 //============================================================================18 ![]() 19 #include <iostream>20 using namespace std;21 ![]() void solve(int n) {22 int x = (n+1)/2 - 1;23 int y = n;24 ![]() for (int i = 0; i < x; ++i) {25 cout << n/2 << " " << 2 << " " << y-2-i << endl;26 n -= 2;27 }28 cout <<"2 " << x << " " << x + 1 << endl;29 }30 ![]() 31 ![]() {32 int n;33 cin >> n;34 ![]() if (n == 1) {35 cout << 0 <<endl;36 return 0;37 }38 ![]() if (n == 2) {39 cout << "1" <<endl;40 cout << "1 1 1" <<endl;41 return 0;42 }43 ![]() if (n % 2 != 0) {44 cout << (n+1)/2 <<endl;45 solve(n);46 }47 ![]() else {48 cout << n/2 + 1 << endl;49 solve(n-1);50 cout << 1 << " "<< n-1 <<" 1" <<endl;51 }52 ![]() 53 return 0;54 }55 ![]() 最后一定要注意1 和 2 的情況,我因為忘了考慮,wa了幾次,呵呵... posted @ 2009-03-06 08:52 WORM 閱讀(324) | 評論 (0) | 編輯 收藏 |
|||||||