1. 程式人生 > >POJ3278-Catch That Cow

POJ3278-Catch That Cow

def ace color 大數 整數 while != div pri

大致題意:

給定兩個整數n和k

通過 n+1或n-1 或n*2 這3種操作,使得n==k

輸出最少的操作次數

解題思路:

三入口的BFS

註意的地方:

由於用於廣搜的 隊列數組 和 標記數組 相當大,如果定義這兩個數組時把它們扔到局部去,編譯是可以的,但肯定執行不了,提交就等RE吧= =

大數組必須開為 全局 。。。常識常識。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 #include <queue>
 6
#define N 100005 7 int n,k; 8 bool mark[N]; 9 int main() 10 { 11 while (scanf("%d %d",&n,&k)!=EOF) 12 { 13 queue<int> q,a; 14 memset(mark,0,sizeof(mark)); 15 q.push(n); 16 a.push(0); 17 mark[n]=1; 18 while (!q.empty()) 19 { 20
int temp=q.front(); 21 int ans=a.front(); 22 q.pop(); 23 a.pop(); 24 if (temp==k) 25 { 26 printf("%d\n",ans); 27 break; 28 } 29 if (temp+1<=100000&&!mark[temp+1
]) 30 { 31 q.push(temp+1); 32 a.push(ans+1); 33 mark[temp+1]=1; 34 } 35 if (temp-1>=0&&!mark[temp-1])//註意邊界條件temp-1>=0 36 { 37 q.push(temp-1); 38 a.push(ans+1); 39 mark[temp-1]=1; 40 } 41 if (temp*2<=100000&&!mark[temp*2]) 42 { 43 q.push(temp*2); 44 a.push(ans+1); 45 mark[temp*2]=1; 46 } 47 } 48 } 49 50 return 0; 51 }

POJ3278-Catch That Cow