51 Node 大鱼吃小鱼(栈水题)

有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼?Input第1行:1个数N,表示鱼的数量(1 <= N <= 100000)。 
第2 - N + 1行:每行两个数Aii, Bii,中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= Aii <= 10^9,Bii = 0 或 1,0表示向左,1表示向右)。Output输出1个数,表示最终剩下的鱼的数量。Sample Input

5
4 0
3 1
2 0
1 0
5 0

输出    2

/*这道题刚看到的时候,没有想到用栈去解决问题,而是想的搜索
如果方向向左,那么就向左搜索,遇到小的就吃掉,但是这个思路
是有问题的,有的鱼就很有可能被提前吃掉,所以是不对的,
于是就改成栈来解决*/
/*首先先将第一个鱼放进去,然后让新来的鱼进行攻关,直到死亡,或者把所有的反方向的鱼
吃掉*/ 
#include <iostream>
#include <stack>
using namespace std;
struct Fish{
	int f,d;    //f为大小,d为方向 
}a[100005];
int main()
{
	int t,i,j,k,n;
	stack<Fish> q;
	while(cin>>n)
	{
		for(i=1;i<=n;i++)
		{
			cin>>a[i].f>>a[i].d;
			if(i==1) q.push(a[i]);     //放入第一条鱼 
			else
			{
				while(!q.empty() && q.top().f<a[i].f && a[i].d==0 && q.top().d==1)    //只要能继续吃,就一直进行 
				{
					q.pop();        //鱼被吃掉 
				}
				if(!q.empty() && q.top().f>a[i].f && a[i].d==0 && q.top().d==1);      //如果还有鱼,并且新的鱼比栈中的鱼小,就不放进去,相当于被吃掉 
				else        //如果新鱼没有被吃掉,放进去 
				q.push(a[i]); 
			}
		}
		cout<<q.size()<<endl;
	}
	return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的大鱼吃小鱼游戏的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define BOARD_WIDTH 80 #define BOARD_HEIGHT 20 typedef struct _fish { int x, y; int size; int speed; } Fish; typedef struct _fish_node { Fish fish; struct _fish_node *next; } FishNode; typedef struct _board { FishNode *fish_list; char board[BOARD_HEIGHT][BOARD_WIDTH]; } Board; void init_board(Board *board); void update_board(Board *board); void draw_board(Board *board); void add_fish(Board *board, int x, int y, int size, int speed); void remove_fish(Board *board, FishNode *node); void move_fish(Board *board, FishNode *node); void eat_fish(Board *board, FishNode *fish, FishNode *food); int random_int(int min, int max); int main() { srand((unsigned)time(NULL)); Board board; init_board(&board); add_fish(&board, BOARD_WIDTH / 2, BOARD_HEIGHT / 2, 5, 1); while (1) { if (_kbhit()) { char key = _getch(); if (key == 'q' || key == 'Q') break; } update_board(&board); draw_board(&board); Sleep(100); } return 0; } void init_board(Board *board) { board->fish_list = NULL; for (int i = 0; i < BOARD_HEIGHT; i++) { for (int j = 0; j < BOARD_WIDTH; j++) { if (i == 0 || i == BOARD_HEIGHT - 1) board->board[i][j] = '-'; else if (j == 0 || j == BOARD_WIDTH - 1) board->board[i][j] = '|'; else board->board[i][j] = ' '; } } } void update_board(Board *board) { FishNode *fish = board->fish_list; while (fish != NULL) { move_fish(board, fish); FishNode *food = board->fish_list; while (food != NULL) { if (food != fish && fish->fish.size > food->fish.size) { int dx = fish->fish.x - food->fish.x; int dy = fish->fish.y - food->fish.y; if (dx * dx + dy * dy < fish->fish.size * fish->fish.size) { eat_fish(board, fish, food); break; } } food = food->next; } fish = fish->next; } } void draw_board(Board *board) { system("cls"); for (int i = 0; i < BOARD_HEIGHT; i++) { for (int j = 0; j < BOARD_WIDTH; j++) { putchar(board->board[i][j]); } putchar('\n'); } } void add_fish(Board *board, int x, int y, int size, int speed) { FishNode *node = (FishNode*)malloc(sizeof(FishNode)); node->fish.x = x; node->fish.y = y; node->fish.size = size; node->fish.speed = speed; node->next = board->fish_list; board->fish_list = node; board->board[y][x] = 'O'; } void remove_fish(Board *board, FishNode *node) { FishNode *prev = NULL; FishNode *curr = board->fish_list; while (curr != NULL) { if (curr == node) { if (prev != NULL) prev->next = curr->next; else board->fish_list = curr->next; free(curr); break; } prev = curr; curr = curr->next; } } void move_fish(Board *board, FishNode *node) { int dx = random_int(-1, 1); int dy = random_int(-1, 1); int x = node->fish.x + dx * node->fish.speed; int y = node->fish.y + dy * node->fish.speed; if (x >= 1 && x < BOARD_WIDTH - 1 && y >= 1 && y < BOARD_HEIGHT - 1) { board->board[node->fish.y][node->fish.x] = ' '; node->fish.x = x; node->fish.y = y; board->board[y][x] = 'O'; } } void eat_fish(Board *board, FishNode *fish, FishNode *food) { fish->fish.size += food->fish.size; fish->fish.speed += food->fish.size / 5; remove_fish(board, food); } int random_int(int min, int max) { return rand() % (max - min + 1) + min; } ``` 这个程序使用了一个简单的结构体来表示鱼,包括鱼的位置、大小和速度。鱼在游戏板上移动,如果两条鱼的距离小于它们的大小之和,那么它们就会碰撞,大鱼会吃掉小鱼。程序使用一个链表来存储所有的鱼,每次更新游戏板时遍历链表,移动每条鱼并检查是否有碰撞发生。如果发生了碰撞,那么程序就会让大鱼吃掉小鱼。程序使用了标准库中的一些函数,包括`stdlib.h`中的`malloc()`和`free()`函数来分配和释放内存,`conio.h`中的`_kbhit()`和`_getch()`函数来读取按键输入,以及`time.h`中的`srand()`函数来初始化随机数生成器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值