精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

電路布線問題C++實現案例

西西 ? 來源:博客園 ? 作者:PhoenixZq ? 2020-08-08 11:48 ? 次閱讀

問題描述:

在一塊電路板的上、下兩端分別有n個接線柱。根據電路設計,要求用導線(i,π(i)) 將上端接線柱i與下端接線柱π(i)相連,如下圖。其中,π(i),1≤ i 《≤n,是{1,2,…,n}的一個排列。導線(I, π(i))稱為該電路板上的第i條連線。對于任何1 ≤ i ≤ j ≤n,第i條連線和第j條連線相交的充要條件是π(i)》 π(j)。

電路板

在制作電路板時,要求將這n條線分布到若干個絕緣層上,在同一層上的連線不能相交。電路布線問題要確定將哪些連線安排在第一層上,使得該層上有盡可能多的連線。換句話說,該問題要求確定導線集Nets = {i,π(i),1 ≤ i ≤ n}的最大不想交子集。

問題分析:

1. 最優子結構性質

記N(i,j) = {t|(t, π(i)) ∈ Nets,t ≤ i, π(t) ≤ j }。 N(i,j)的最大不相交子集為MNS(i,j)。Size(i,j)=|MNS(i,j)|。

1) 當i = 1時

2) 當i 》1時,

① j 《π(i)。此時,(i,π(i)) 不屬于N(i,j)。故在這種情況下,N(i,j) = N(i-1,j),從而Size(i,j)=Size(i-1,j)。

② j ≥π(i)。此時,若(i, π(i))∈MNS(i,j),則對任意(t, π(i))∈MNS(i,j)有t 《 i且π(t)《 π(i);否則,(t,π(t))與(i, π(i))相交。在這種情況下MNS(i,j)-{(i, π(i))}是N(i-1, π(i)-1)的最大不相交子集。否則,子集MNS(i-1,π(i)-1)∪{(i, π(i))}包含于N(i,j)是比MNS(i,j)更大的N(i,j)的不相交子集。這與MNS(i,j)的定義相矛盾。

若(i, π(i))不屬于MNS(i,j),則對任意(t, π(t))∈MNS(i,j),有t《i。從而MNS(i,j)包含于N(i-1,j),因此,Size(i,j)≤Size(i-1,j)。

另一方面,MNS(i-1,j)包含于N(i,j),故又有Size(i,j) ≥Size(i-1,j),從而Size(i,j)= Size(i-1,j)。

2. 遞歸計算最優值

經以上后分,可電路布線問題的最優值為Size(n,n)。由該問題的最優子結構性質可知:

C++程序:

//CircuitLayout.h

#ifndef CIRCUITLAYOUT_H

#define CIRCUITLAYOUT_H

class CircuitLayout{

private:

int count;//最大連線柱

int *c;//int **Size;//最大連線數目

int *net;//存儲連線

bool Input();

int max(int,int);

void mnset(int *c,int **Size);//計算最優值

int traceback(int *c,int **Size,int *net);//構造最優解

public

CircuitLayout();

~CircuitLayout();

bool Run();//運行接口函數

};

#endif

//CircuitLayout.cpp

#include “CircuitLayout.h”

#include 《iostream》

#include 《math.h》

using namespace std;

#define MAX(a,b) (((a)》(b)?(a):(b)))

#define M 50

CircuitLayout::CircuitLayout(){

int N = 0;

c = new int[M];

net = new int[M];

Size = new int*[M];

for(int i=0;i《M;++i)

Size[i] = new int[M];

}

CircuitLayout::~CircuitLayout(){

for(int i=0;i《M;++i)

delete []Size[i];

delete []Size;

delete []c;

delete []net;

}

bool CircuitLayout::Input(){

int n;

cout 《《 “請輸入接線柱的個數: ”;

cin 》》 n;

count = n;

cout 《《 “請依次輸入被連接數: ” 《《 endl;

for(int i=0;i《n;++i)

cin 》》 c[i];

if(c) return true;

else return false;

}

int CircuitLayout::max(int a,int b){

if(a 》= b) return a;else return b;

}

void CircuitLayout::mnset(int *c,int **Size){

int i=0;

int j=0;

int n = count-1;

for(j=0;j《c[1];j++)

Size[1][j] = 0;

for(j=c[1];j《=n;j++)

Size[1][j] = 1;

for (i=2;i《n;i++){

for (j=0; j《c[i] ; j++)

Size[i][j] = Size[i-1][j];

for (j=c[i];j《=n;j++)

Size[i][j] = max(Size[i-1][j],Size[i-1][c[i]-1]+1);

}

Size[n][n] = max(Size[n-1][n],Size[n-1][c[n]-1]+1);

cout 《《 “s[n][n]: ” 《《 Size[n][n] 《《 endl;

}

int CircuitLayout::traceback(int *c,int **Size,int *net){

int n = count-1;

int j = n;

int m = 0;

for (int i=n;i》0;i--){

if (Size[i][j] != Size[i-1][j]){

net[m++] = i; j = c[i] - 1;

}

}

if(j》=c[0])

net[m++] = 0;

for(int k=0;k《m;++k)

cout 《《 “net: ” 《《 net[k] 《《 “ ”;

cout 《《 endl;

return m;

}

bool CircuitLayout::Run(){

int msize = 0;

if(Input()){

mnset(c,Size);

msize = traceback(c,Size,net);

cout 《《 “msize: ”《《 msize;

cout 《《 endl;return true;

}

else return false;}

int main(){

CircuitLayout xiaoli;

xiaoli.Run();

return 0;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電路板
    +關注

    關注

    140

    文章

    4908

    瀏覽量

    97441
  • C++
    C++
    +關注

    關注

    22

    文章

    2104

    瀏覽量

    73500
  • 電路布線
    +關注

    關注

    0

    文章

    9

    瀏覽量

    10938
收藏 人收藏

    評論

    相關推薦

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?146次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優化與整理,已經是非常貼近開發的使用習慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發表于 07-26 09:20 ?794次閱讀

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++實現類似instanceof的方法

    函數,可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java中的instanceof的功能。 在 C++ 中,確定對象的類型是編程中實際需求,使開發人員
    的頭像 發表于 07-18 10:16 ?537次閱讀
    <b class='flag-5'>C++</b>中<b class='flag-5'>實現</b>類似instanceof的方法

    如何在FX3 SuperSpeed explorer等電路板上使用openOCD調試C++項目?

    配置與文檔中的完全相同。 因此,我想請教如何在 FX3 SuperSpeed explorer 等電路板上使用 openOCD 調試我的 C++ 項目? 回到純 C 項目并不是一個真正的選擇,而且僅通過 uart 進行調試是不夠
    發表于 05-23 08:16

    C/C++中兩種宏實現方式

    #ifndef的方式受C/C++語言標準支持。它不僅可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件(或者代碼片段)不會被不小心同時包含。
    的頭像 發表于 04-19 11:50 ?554次閱讀

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C
    的頭像 發表于 04-14 11:43 ?2513次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?739次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    c語言,c++,java,python區別

    C語言、C++、Java和Python是四種常見的編程語言,各有優點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠對計算機硬件進行直接操作。
    的頭像 發表于 02-05 14:11 ?2249次閱讀

    vb語言和c++語言的區別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB語言和C++語言的區別。 設計目標: VB語言(Visual Basic)是由
    的頭像 發表于 02-01 10:20 ?2076次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?541次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    C語言和C++中那些不同的地方

    C語言雖說經常和C++在一起被大家提起,但可千萬不要以為它們是一個東西。現在我們常用的C語言是C89標準,C++
    的頭像 發表于 12-07 14:29 ?915次閱讀
    <b class='flag-5'>C</b>語言和<b class='flag-5'>C++</b>中那些不同的地方

    C200/C210 PCB布線指南

    C200/C210 PCB布線指南
    的頭像 發表于 11-30 18:16 ?713次閱讀
    <b class='flag-5'>C</b>200/<b class='flag-5'>C</b>210 PCB<b class='flag-5'>布線</b>指南

    開箱即用!教你如何正確使用華為云CodeArts IDE for C/C++

    C/C++編碼體驗、方便的訪問華為云資源、簡單的引用華為云服務于一身,實現C/C++開發者在個人研發作業體驗和效率上的巨大提升。 為了幫助
    的頭像 發表于 11-29 17:40 ?760次閱讀
    開箱即用!教你如何正確使用華為云CodeArts IDE for <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>!