poj3278 结题报告

这个题是一个容易理解题意的简单BFS题目.....作为菜鸟的我竟然能自己想到解决方案...不容易...

个人思路如下,

农夫在每个点都有三种走法,我们先把初始位置标记为走过,三种方法位置没走过就入队,开始三个点都能入队,再对三个点每次出队一个,

分析这个点的三个位置能否走,能走得入队,...依此类推.....

这里我用的访问数组是乘以个系数再加上一个数...for循环判断..

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int N,K;
int flag[2000001];//这里开到两百万,为什么我也不清楚,开始一直RE后面这个就过啦?有知道的可以指教一下....

struct point 
{
 int x,step;
}t,p;


int  arr[3][2]={1,1,1,-1,2,0};//这里指定义访问方向,就是向前和向后,还有一个乘以2的
void bfs()
{
 queue<point>q;
 t.x=N;
 t.step=0;
 q.push(t);
 flag[N]=1;
 while(!q.empty())
 {
  t=q.front();
  q.pop();
  if(t.x == K)
  {
   printf("%d\n",t.step );
   return;
  }
  for(int i=0;i<3;i++)
  {
   p=t;
   p.step++;
   p.x=t.x*arr[i][0]+arr[i][1];
   if(p.x>=0 && !flag[p.x] && p.x<200000)//20万
   {
    flag[p.x]=1;
    q.push(p);
   }
  }
 }
}

int main()
{
 while(scanf("%d%d",&N,&K)!=EOF)
 {
  memset(flag,0,sizeof(flag));
  if(N>K)//                        我试了一下这个判断有无对程序影响不大...
   printf("%d\n",N-K);
  
  else
   bfs();
 }
 return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值