洛谷P3818小A和uim之大逃离 II

思路


vis前两维记录坐标,第三维记录是否用过药水,然后bfs即可,注意数组越界问题。
注意如果一个点用过了药水,则他所有可以扩展的点的状态都是喝过的,就是flag=1,不能再用药水了,不用再搜。这个点没用过的话,它扩展的点的既有不用的(上下左右),也有用药水的,都要入队。

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long  
const ll MAXN = 2010;
struct point{
	long long x1,y1,step,flag;
}start;
queue<point> dl;
ll dx[4] = {0,0,1,-1};
ll dy[4] = {1,-1,0,0};
char mp[MAXN][MAXN];
bool v[MAXN][MAXN][2];
ll n,m,f,d,r;
int main() {
	cin>>n>>m>>d>>r;
	for(ll i=1;i<=n;i++){
		for(ll j=1;j<=m;j++){
			cin>>mp[i][j];
		}
	}
	start.x1=1;
	start.y1=1;
	start.step=1; 
	start.flag=0;
	dl.push(start);
	v[1][1][0] = 1;
	while (!dl.empty()) {
		point head = dl.front();
		dl.pop();
		if(head.x1==n&&head.y1==m) {
			cout<<head.step-1<<endl;
			return 0;
		}
		f=head.flag;
		for (ll i=0;i<4;i++) {
			ll tx = dx[i]+head.x1;
			ll ty = dy[i]+head.y1;
			if (tx>0&&tx<=n&&ty>0&&ty<=m&&mp[tx][ty]!='#'&&v[tx][ty][f]==0) {
				v[tx][ty][f] = 1;
				point temp;
				temp.x1 = tx;
				temp.y1 = ty;
				temp.flag=f;
				temp.step = head.step + 1;
				dl.push(temp);
			}
		}
		ll tx = head.x1+d, ty = head.y1+r;
		if (tx>0&&tx<=n&&ty>0&&ty<=m&&f==0&&!v[tx][ty][1]&&mp[tx][ty]!='#') {
			v[tx][ty][1] = 1;
			point temp;
			temp.x1 = tx;
			temp.y1 = ty;
			temp.flag=1;
			temp.step = head.step + 1;
			dl.push(temp);
		}
	}
	cout<<-1<<endl;
	return 0;
}
# 题目重述 银行定期存款年利率为:一年定存3.5%,五年定存4%。小AUim各有10000元。小A每次存一年期,到期后连本带利再存一年,共存5年;Uim直接存五年定期。求5年后两人各自的金额。 # 给出答案(答案为带注释的代码块) ```cpp #include <iostream> #include <iomanip> using namespace std; int main() { double xiaoA_money = 10000; // 小A初始金额改为10000元 double uim_money = 10000; // Uim初始金额改为10000元 double rate_1year = 0.035; // 一年期利率 double rate_5year = 0.04; // 五年期利率 // 小A每年续存一年期,复利计算 for (int i = 0; i < 5; i++) { xiaoA_money *= (1 + rate_1year); // 每年本息 } // Uim一次存五年,单利计算 uim_money *= (1 + rate_5year * 5); // 输出结果,保留两位小数 cout << fixed << setprecision(2); cout << "5年后小A有: " << xiaoA_money << " 元" << endl; cout << "5年后Uim有: " << uim_money << " 元" << endl; return 0; } ``` # 代码解析 1. **变量修改**:将初始金额从110000元改为10000元; 2. **复利计算不变**:小A仍按年复利$(1+3.5\%)^5$增长; 3. **单利计算不变**:Uim按五年总利率$4\% \times 5$计算; 4. **输出格式化**:确保金额显示保留两位小数。 # 知识点(列出该代码中遇到的知识点) - **复利计算**:每期利息加入本金继续生息,公式为 $A = P(1+r)^n$。 - **单利计算**:利息不重复计息,公式为 $A = P(1 + r \times t)$。 - **C++循环结构**:`for`循环用于模拟逐年滚存过程,实现迭代计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值