进一步了解了bfs;
题意:给你n,然后用+,-,*三种运算使n变成k;
漏洞:在算出新的数字之后,一定要判边界,否则RE,而且在每一步后面都得加判断是否等于K,如果是即刻退出,否则WA,判这个的时候需要顺序;
不过不明白为什么bfs这两个顺序为啥结果不同
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #define N 101000 6 using namespace std; 7 int d[301000],vis[301000]; 8 int k,n; 9 int OK(int t) 10 { 11 if(t < 0 || t > N) 12 return 0; 13 return 1; 14 } 15 int bfs() 16 { 17 queue<int> q; 18 q.push(n); 19 memset(d,0,sizeof(d)); 20 memset(vis,0,sizeof(vis)); 21 d[n] = 0; 22 vis[n] = 1; 23 int s; 24 while(!q.empty()) 25 { 26 int t = q.front(); 27 q.pop(); 28 // if(s == k)///满足条件才能到这一条 29 // return d[s]; 30 for(int i=0; i<3; i++) 31 { 32 if(i==0) s = t + 1; 33 if(i==1) s = t - 1; 34 if(i==2) s = t * 2; 35 if(OK(s)&&!vis[s]) 36 { 37 vis[s] = 1; 38 q.push(s); 39 d[s] = d[t] + 1; 40 } 41 else 42 continue; 43 if(s == k)///满足条件才能到这一条,放在上边就错了,为啥啊 44 return d[s]; 45 } 46 } 47 return -1; 48 } 49 int main() 50 { 51 while(~scanf("%d%d",&n,&k)) 52 { 53 if(n>=k) 54 cout<<n-k<<endl; 55 else 56 cout<<bfs()<<endl; 57 } 58 return 0; 59 }