The Wall Pushers UVA - 10384

这是一道考察抽象思维的编程题目。通过为每个方向分配编号,并利用位运算来表示方向的权值,可以解决遇到障碍物时的移动问题。算法从起点开始,检查每个方向,判断是否存在连续障碍物,若无则移动障碍物并递归检查,最终输出结果。详细实现见代码解析。

考察抽象思维的一道题目,对各个方向进行编号,从w方向开始,将该方向编号为0,逆时针加1作为每个方向的编号,这样就可以保证对于编号i,1<<i也就满足对应方向的对应权值,然后从起始点开始,对于每个方向,判断这个方向是否存在障碍物,如果是存在障碍物的,那么就继续判断是否存在两个连续的障碍物,如果不是,那么就“移动”该障碍物,这个移动反映到数学上,也就是更新各个格子的数值,然后再递归判断,如果没有障碍物,就直接递归判断就行了,最后打印结果,具体实现见如下代码:

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;

int x, y;
int area[10][10];

const string dir = "WNES";
int dx[] = {0,-1,0,1};
int dy[] = {-1,0,1,0};

int getMinStep(int cur_x,int cur_y){
	int res = 10;
	for (int i = 1; i <= 4; i++){
		if ((area[i][1] & 1) != 1){
			res = min(res, abs(cur_x - i) + cur_y);
		}
		if ((area[i][6] & 4) != 4){
			res = min(res, abs(cur_x - i) + 7 - cur_y);
		}
	}
	for (int j = 1; j <= 6; j++){
		if ((area[1][j] & 2) != 2){
			res = min(res, abs(cur_y - j) + cur_x);
		}
		if ((area[4][j] & 8) != 8){
			res = min(res, abs(cur_y - j) + 5 - cur_x);
		}
	}
	return res;
}

bool dfs(int step,int cur_x,int cur_y,string s,int up1){
	if (step == up1&&(cur_x == 0 || cur_x == 5 || cur_y == 0 || cur_y == 7)){
			cout << s << endl;
			return true;
	}
	int remain = getMinStep(cur_x, cur_y);
	if (remain + step > up1) return false;
	for (int i = 0; i < 4; i++){
		int newx = cur_x + dx[i];
		int newy = cur_y + dy[i];
		if (newx >= 0 && newx <= 5 && newy >= 0 && newy <= 7){
			if ((area[cur_x][cur_y] & (1 << i)) == (1 << i)){
				if (newx != 0 && newx != 5 && newy != 0 && newy != 7 &&
					(area[newx][newy] & (1 << i)) != (1 << i)){
					area[cur_x][cur_y] -= (1 << i);
					area[newx][newy] = area[newx][newy] - (1 << ((i + 2) % 4)) + (1 << i);
					area[newx + dx[i]][newy + dy[i]] += (1 << ((i+2)%4));
					if (dfs(step + 1, newx, newy, s + dir[i],up1)) return true;
					area[cur_x][cur_y] += (1 << i);
					area[newx][newy] = area[newx][newy] + (1 << ((i + 2) % 4)) - (1 << i);
					area[newx + dx[i]][newy + dy[i]] -= (1 << ((i+2)%4));
				}
			}else{
				if (dfs(step + 1, newx, newy, s+dir[i],up1)){
					return true;
				}
			}
		}
	}
	return false;
}

int main(){
	while (cin >> y >> x){
		if (x == 0 && y == 0) break;
		for (int i = 1; i <= 4; i++){
			for (int j = 1; j <= 6; j++){
				cin >> area[i][j];
			}
		}
		for (int up1 = 1;; up1++){
			if (dfs(0, x, y, "",up1)){
				break;
			}
		}
	}
	return 0;
}


内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真全过程,涵盖了风力机空气动力学模型、PMSG电磁特性建模、不可控整流与逆变电路、直流环节、空间矢量脉宽调制(SVPWM)技术以及核心控制策略的设计。重点实现了最大功率点跟踪(MPPT)控制以提升风能捕获效率,并构建了电压外环与电流内环协同工作的双闭环控制系统,通过仿真验证了系统在不同风速条件下稳定运行的能力及动态响应性能。; 适合人群:适用于具备电力系统、电机控制理论基础及Simulink仿真操作经验的研究生、科研人员和从事新能源发电系统开发的工程技术人员;特别适合正在进行风电系统建模、控制算法研究或完成相关毕业设计的专业人士。; 使用场景及目标:①深入理解直驱式PMSG风力发电系统的整体架构与工作机理;②掌握从物理部件建模到控制策略实现的完整Simulink仿真流程;③学习并复现MPPT控制、双闭环控制等关键技术方案;④为后续开展低电压穿越、并网稳定性分析、故障诊断等高级课题提供可靠的仿真平台支撑。; 阅读建议:建议结合Matlab/Simulink软件动手实践,逐模块搭建模型,重点关注各控制环节的参数设计与调试方法,同时可参照文中提供的其他风电相关资源进行拓展学习与对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值