sicily 1151

大概思路跟1150的一样,数据量大了,我刚开始是用set<string>来存已经变换过的魔板,结果TLE,后来网上查了一下,用康托,结果WA。。但是我又不知道错在哪。最后用set<int>来存,AC了哦

/* * 1150.cpp * * Created on: Dec 18, 2010 * Author: alfred */ #include <queue> #include <string> #include <cstring> #include <iostream> #include <set> using namespace std; struct step { int status[8]; string step; }; int target[8]; const int init[8] = {1, 2, 3, 4, 8, 7, 6, 5}; int maxStep; set<long> s; //bool isUsed[50000]; //int fac[8]; // //void setFac() { // fac[0] = fac[1] = 1; // for(int i = 2; i < 8; i++) { // fac[i] = fac[i - 1] * i; // } //} //int getID(int* tar) { // bool used[8]; // memset(used, false, sizeof(used)); // int id = 0; // for(int i = 0; i < 8; i++) { // for(int j = 1; j < tar[i]; j++) { // if(!used[j]) id += fac[7 - i]; // } // used[tar[i] - 1] = true; // } // return id; //} long getID(int* tar) { return tar[7] * 1 + tar[6] * 10 + tar[5] * 100 + tar[4] * 1000 + tar[3] * 10000 + tar[2] * 100000 + tar[1] * 1000000 + tar[0] * 10000000; } void A(queue<step>& q, const step& statu) { step tmp; for(int i = 0; i < 4; i++) { tmp.status[i] = statu.status[i + 4]; tmp.status[i + 4] = statu.status[i]; } tmp.step = statu.step + 'A'; long id = getID(tmp.status); if(s.find(id) == s.end()) { q.push(tmp); // isUsed[id] = true; s.insert(id); } } void B(queue<step>& q, const step& statu) { step tmp; for(int i = 1; i < 4; i++) { tmp.status[i] = statu.status[i - 1]; tmp.status[i + 4] = statu.status[i - 1 + 4]; } tmp.status[0] = statu.status[3]; tmp.status[4] = statu.status[7]; tmp.step = statu.step + 'B'; long id = getID(tmp.status); if(s.find(id) == s.end()) { q.push(tmp); // isUsed[id] = true; s.insert(id); } } void C(queue<step>& q, const step& statu) { step tmp; tmp.status[0] = statu.status[0]; tmp.status[1] = statu.status[5]; tmp.status[2] = statu.status[1]; tmp.status[3] = statu.status[3]; tmp.status[4] = statu.status[4]; tmp.status[5] = statu.status[6]; tmp.status[6] = statu.status[2]; tmp.status[7] = statu.status[7]; tmp.step = statu.step + 'C'; long id = getID(tmp.status); if(s.find(id) == s.end()) { q.push(tmp); // isUsed[id] = true; s.insert(id); } } void bfs() { s.clear(); // memset(isUsed, false, sizeof(isUsed)); queue<step> q; step tmp; memcpy(tmp.status, init, sizeof(init)); q.push(tmp); long id = getID(tmp.status); // isUsed[id] = true; s.insert(id); while(!q.empty()) { tmp = q.front(); q.pop(); if(memcmp(tmp.status, target, sizeof(target)) == 0) { cout << tmp.step.size() << " " << tmp.step << endl; return; } if(tmp.step.size() == maxStep) { continue; } A(q, tmp); B(q, tmp); C(q, tmp); } cout << -1 << endl; } int main() { // setFac(); cin >> maxStep; while(maxStep != -1) { for(int i = 0; i < 8; i++) { cin >> target[i]; } bfs(); cin >> maxStep; } return 0; }

已换康托,0.22sec,不错。

#include <iostream> #include <string> #include <queue> #include <cstring> using namespace std; struct node { int s[8]; string step; }; int maxStep; int init[8] = {1, 2, 3, 4, 8, 7, 6, 5}; int tar[8]; int fac[7]; bool isUsed[50000]; void setFac() { fac[0] = 1; for(int i = 2; i <= 7; i++) { fac[i - 1] = fac[i - 2] * i; } } int getID(int *data) { bool used[8]; memset(used, false, sizeof(used)); int id = 0; for(int i = 0; i < 8; i++) { for(int j = 1; j < data[i]; j++) { if(!used[j - 1]) id += fac[6 - i]; } used[data[i] - 1] = true; } return id; } void bfs() { memset(isUsed, false, sizeof(isUsed)); queue<node> q; node _front; memcpy(_front.s, init, sizeof(init)); _front.step = ""; isUsed[getID(init)] = true; node _tmp; q.push(_front); int id; while(!q.empty()) { _front = q.front(); q.pop(); int step = _front.step.size(); if(memcmp(_front.s, tar, sizeof(tar)) == 0) { cout << step << " " << _front.step << endl; return ; } if(step >= maxStep) continue; _tmp = _front; //A operator _tmp.s[0] = _front.s[4]; _tmp.s[1] = _front.s[5]; _tmp.s[2] = _front.s[6]; _tmp.s[3] = _front.s[7]; _tmp.s[4] = _front.s[0]; _tmp.s[5] = _front.s[1]; _tmp.s[6] = _front.s[2]; _tmp.s[7] = _front.s[3]; id = getID(_tmp.s); if(!isUsed[id]) { _tmp.step = _front.step + "A"; q.push(_tmp); isUsed[id] = true; } //B operator _tmp.s[0] = _front.s[3]; _tmp.s[1] = _front.s[0]; _tmp.s[2] = _front.s[1]; _tmp.s[3] = _front.s[2]; _tmp.s[4] = _front.s[7]; _tmp.s[5] = _front.s[4]; _tmp.s[6] = _front.s[5]; _tmp.s[7] = _front.s[6]; id = getID(_tmp.s); if(!isUsed[id]) { _tmp.step = _front.step + "B"; q.push(_tmp); isUsed[id] = true; } //C operator _tmp.s[0] = _front.s[0]; _tmp.s[1] = _front.s[5]; _tmp.s[2] = _front.s[1]; _tmp.s[3] = _front.s[3]; _tmp.s[4] = _front.s[4]; _tmp.s[5] = _front.s[6]; _tmp.s[6] = _front.s[2]; _tmp.s[7] = _front.s[7]; id = getID(_tmp.s); if(!isUsed[id]) { _tmp.step = _front.step + "C"; q.push(_tmp); isUsed[id] = true; } } cout << -1 << endl; } int main() { int a; setFac(); while(cin >> maxStep && maxStep != -1) { for(int i = 0; i < 8; i++) { cin >> tar[i]; } bfs(); } return 0; }

【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值