P1256. 小可的手机

题目描述

集训的某天中午,小可趁着午休跑到大街上溜达,忽然乌云密布,预示着一场暴雨即将到来,吓得小可急忙跑回集训营,幸运的是,暴雨在小可飞奔到集训营楼下的下一秒才开始下。

“呼~”,就在小可庆幸没被突至的暴雨淋湿的时候,在二楼刚打扫完卫生的小达将一盆污水朝楼下泼了出去,真没素质,十分精准的命中了小可,还是没躲过被淋湿,衣服湿透的小可刚想上楼找小达算账,却想起衣服口袋里还有一个存储着重要资料的手机

“糟糕”,小可的手机进水了。

小可的手机内部的电路板可以被看做是一个�∗�n∗m的二维平面,我们用三种符号简单的表示小可手机的电路板构造

  • 0:表示该位置上没有电子元件
  • 1:表示该位置上有电子元件
  • *:表示水滴

正常情况下,水滴会沿着重力方向一直流动,直到流出边界,一旦水滴经过任意一个电子元件,小可的手机就会报废。

小可急忙把手机转了方向,想改变重力方向改变水滴的流向,我们用sxzy四个字符分别代表上下左右

小可想知道,在这种方向下,他的手机会不会报废

输入格式

第一行为两个正整数�,�n,m和一个字符�ℎch,代表着小可手机的简易电路板的大小,和小可手机的重力方向

接下来 �n 行每行 �m个字符,代表着电路板上的构造情况,不保证电路板上一定会有水滴。

输出格式

若小可的手机会报废则输出Over,不会则输出Fine

输入数据 1

3 3 x
0*0
000
111

Copy

输出数据 1

Over

Copy

第一行第二列的水滴向下流到了第三行第二列的电子原件上,报废

输入数据 2

3 3 y
000
*01
000

Copy

输出数据 2

Over

Copy

第二行第一列的水滴向右流到了第二行第三列的电子原件上,报废

输入数据 3

3 3 s
0*0
000
111

Copy

输出数据 3

Fine

Copy

第一行第二列的水滴向上流出边界,未经过电子元件,没报废

数据范围与约定

对于全部数据,1≤n,m≤1001≤n,m≤100 

#include<bits/stdc++.h>
using namespace std;
int main(){
	char a[1001][1001];
	int n,m;cin>>n>>m;
	char fx;cin>>fx;
	bool ans_1=true;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
			
	}
		
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='*'){
				if(fx=='s'){
					int t=i;
					while(t--){
						if(a[t][j]=='1'){
							cout<<"Over";
							return 0;
						}
					}
				}else if(fx=='x'){
					for(int t=i;t<=n;t++){
						if(a[t][j]=='1'){
							cout<<"Over";
							return 0;
						}
					}
				}else if(fx=='z'){
					int t=j;
					while(t--){
						if(a[i][t]=='1'){
							cout<<"Over";
							return 0;
						}
					}
				}else{
					for(int t=j;t<=n;t++){
						if(a[i][t]=='1'){
							cout<<"Over";
							return 0;
						}
					}
				}
			}
		}
	}
	cout<<"Fine\n";
	return 0;
}                                                       

小可抽到一个正数时,他会选择继续抽下一个格子,因为这样能够增加他获得的糖果数量。当小可抽到一个负数时,他会选择停止抽奖,因为这样能够避免失去更多的糖果。 为了求得小可能够获得的最大糖果数量,我们可以使用动态规划的思想。假设dp[i]表示小可从第1个格子抽到第i个格子能够获得的最大糖果数量。 那么,对于第i个格子,有两种情况: 1. 小可选择继续抽下一个格子,那么第i个格子的糖果数量会被加到之前的总糖果数量上,即dp[i] = dp[i-1] + a[i]; 2. 小可选择停止抽奖,那么第i个格子的糖果数量就是小可之前已经获得的最大糖果数量,即dp[i] = dp[i-1]。 综上所述,我们可以得到状态转移方程: dp[i] = max(dp[i-1] + a[i], a[i]) 最后,小可能够获得的最大糖果数量就是dp[n],其中n表示格子的数量。 以下是使用C++实现该算法的代码: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int getMaxCandies(vector<int>& candies) { int n = candies.size(); vector<int> dp(n + 1, 0); for (int i = 1; i <= n; i++) { dp[i] = max(dp[i - 1] + candies[i - 1], candies[i - 1]); } return dp[n]; } int main() { int n; cout << "请输入格子的数量: "; cin >> n; vector<int> candies(n); cout << "请输入每个格子中的糖果数量: "; for (int i = 0; i < n; i++) { cin >> candies[i]; } int maxCandies = getMaxCandies(candies); cout << "小可能够获得的最大糖果数量是: " << maxCandies << endl; return 0; } ``` 希望以上代码能够帮助到你,如果有任何疑问,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值