NOJ1005 打导弹(广搜、队列)

这个代码里面用的是标准队列的基本运算,所以前面定义对的基本运算的代码比较长,其实真正核心算法还是比较简单的。大家如果不想让代码显的这么长的话,可以用数组实现队列的基本运算,那这个代码就短多了哟~只是我只要在代码库里面把队列运算代码拷过来就行,那是用起来就很方便了的~

 

 

#include<stdio.h>
#include<stdlib.h>
typedef struct
{int data;
 int pos;
 int num;
}node;

typedef struct
{node pos_mes[100];
 int front,rear;
}sequeue;

sequeue *q;
node P;
int m,a[20],b[20],max[20];

void SETNULL(sequeue *sq)
{
 sq->front=99;
 sq->rear=99;
}

int EMPTY(sequeue *sq)
{
 if(sq->rear==sq->front)
  return 1;
 else
  return 0;
}

int ENQUEUE(sequeue *sq,node x)
{
 if(sq->front==(sq->rear+1)%100)
  return 0;
 else
  {
   sq->rear=(sq->rear+1)%100;
   sq->pos_mes[sq->rear]=x;
   return 1;
  }
}

node DEQUEUE(sequeue *sq)
{
 node Z;
 Z.data=-5; Z.pos=-5; Z.num=-5;
 if(EMPTY(sq))
  return Z;
 else
  {
   sq->front=(sq->front+1)%100;
   return (sq->pos_mes[sq->front]);
  }
}
int BFS(int j)
{
 int i;
 node N;
 N.data=a[j];N.num=1;N.pos=j;
 ENQUEUE(q,N);
 while(!EMPTY(q))
 {
  N=DEQUEUE(q);
  for(i=N.pos+1;i<m;i++)
   {
    P.data=a[i];
    P.pos=i;
    P.num=N.num+1;
    if(N.data>P.data)
     ENQUEUE(q,P);
    else
     continue;
   }
 }
 return N.num;
}

int f()
{
 int i,x=0,j=0,min[20],da[20][20],k;
 memset(min,0,sizeof(min));
 memset(da,30001,sizeof(da));
 da[0][0]=a[0];
 for(i=1;i<m;i++)
  {
   for(j=0;j<=x;j++)
   {
    if(da[j][min[j]]>a[i])
     {da[j][++min[j]]=a[i]; break;}
    else
     continue;
   }
   if(j>x)
   {
    min[j]=0;
    da[j][min[j]]=a[i];
    x=j;
   }
  }
 return x+1;
}


int main()
{
 int M=0,Max=0,i=0,count=0;
 q=malloc(sizeof(sequeue));
 SETNULL(q);
 while(scanf("%d",&a[i])!=EOF)
  i++;
 m=i;
 memset(b,0,sizeof(b));
 memset(max,0,sizeof(max));
 i=0;
 while(i<m)
 {
  M=BFS(i);
  if(Max<M)
   Max=M;
  i++;
 }
 count=f();
 printf("%d/n",Max);
 printf("%d/n",count);
 return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值