!POJ 3278 Catch That Cow

题意:两个整数,N 和 M,N有三种变换:-1 ,+1 ,, *2 ,求N通过这三种变换变为M的最小的次数

分析:这题用BFS。

这题的问题主要是:

1.难以想到用BFS来做

知道用BFS之后就很快的写出来代码,但是还是出错了:

2.TLE。原因是没有标记出现过的数,广搜一定要记得标记

3.RE。 N的范围在0到1000000,要把N的范围限制在这里面

4.WA。有一种特殊情况 N=M,要单独讨论(BFS和DFS出现WA的时候如果算法都没错那基本上就是一些特殊情况没有考虑到,所以做题的时候最好先把这些情况提出来)

#include<iostream>#include<cstring>#include<queue>using namespace std;int n,m;struct h{int w,g;};queue<h> q;int cnt;int vis[1000009];int bfs(){h tmp;int t;while(!q.empty()){tmp=q.front();t=tmp.g;q.pop();h tmp2;for(int i=0;i<3;i++){switch(i){case 0:tmp2.w=tmp.w-1;break;case 1:tmp2.w=tmp.w+1;break;default:tmp2.w=2*tmp.w;}if(tmp2.w>=0&&tmp2.w<=100000){if(tmp2.w==m) return t+1;if(!vis[tmp2.w]){vis[tmp2.w]=1;tmp2.g=t+1;q.push(tmp2);}}}}}int main(){memset(vis,0,sizeof(vis));cin>>n>>m;if(n==m) cout<<"0"<<endl;else{h tmp;tmp.w=n,tmp.g=0;vis[n]=1;q.push(tmp);cnt=bfs();cout<<cnt<<endl;}return 0;}

然后继续努力,把让自己跌倒的石头搬掉或绕过去,不就解决问题了吗

!POJ 3278 Catch That Cow

相关文章:

你感兴趣的文章:

标签云: