首页 > 其他分享 >7-10 电路布线

7-10 电路布线

时间:2023-12-23 21:58:40浏览次数:86  
标签:10 fr int vis 电路 布线 dx dy

7-10 电路布线

在解决电路布线问题时,一种很常用的方法就是在布线区域叠上一个网格,该网格把布线区域划分成m*n个方格,布线时,转弯处必须采用直角,如已经有某条线路经过一个方格时,则在该方格上不允许叠加布线。如下图所示,如从一个方格a(2,1)的中心点到另一个方格b(8,8)的中心点布线时, 每个方格布线时需要1个单位的电路材料,所需要最少的电路材料是16。

image

输入格式:

第一行输入网格的m和n

第二行开始输入网格中已经布线的情况,如果已经有布线时,用1表示,尚未布线时,用0表示。

接下来两行分别输入需要布线的起始位置a和结束位置b。

输出格式:

输出从起始位置a到结束位置b布线时所需要的最少电路材料。

输入样例:

在这里给出一组输入。例如:

8 8
1 1 1 1 1 1 1 1
0 0 0 0 0 1 1 1
1 0 1 1 0 0 0 1
1 0 1 1 0 1 1 0
1 0 1 1 1 1 1 1
1 0 1 1 0 0 0 1
1 0 0 0 0 1 0 0
1 1 1 1 1 1 1 0
2 1
8 8

输出样例:

在这里给出相应的输出。例如:

16

简化版代码

#include <iostream>
#include <queue>
using namespace std;

const int N = 1010;

int mp[N][N], siz[N][N];
bool vis[N][N];

int X[] = {1, 0, -1, 0};
int Y[] = {0, 1, 0, -1};

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            scanf("%d", &mp[i][j]);
        }
    }
    int x1, y1, x2, y2;
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    queue<pair<int, int>> q;
    q.push({x1, y1});
    vis[x1][y1] = true;
    while (q.size()) {
        pair<int, int> fr = q.front();
        if (fr.first == x2 && fr.second == y2) break;
        q.pop();
        for (int i = 0; i < 4; ++i) {
            int dx = fr.first + X[i];
            int dy = fr.second + Y[i];
            if (dx < 1 || dx > n || dy < 1 || dy > m) continue;
            if (vis[dx][dy] || mp[dx][dy]) continue;
            q.push({dx, dy});
            siz[dx][dy] = siz[fr.first][fr.second] + 1;
            vis[dx][dy] = true;
        }
    }
    printf("%d\n", siz[x2][y2] + 1);
  
    return 0;
}

注释版代码

#include <iostream>
#include <queue>
using namespace std;

const int N = 1010;

// 定义网格和距离的数组
int mp[N][N], siz[N][N];

// 记录是否访问过的数组
bool vis[N][N];

// 定义四个方向的数组:下、右、上、左
int X[] = {1, 0, -1, 0};
int Y[] = {0, 1, 0, -1};

int main()
{
    // 输入行数和列数
    int n, m;
    scanf("%d %d", &n, &m);

    // 输入网格矩阵
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            scanf("%d", &mp[i][j]);
        }
    }

    // 输入起始和目标位置
    int x1, y1, x2, y2;
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

    // 创建队列进行广度优先搜索(BFS)
    queue<pair<int, int>> q;
    q.push({x1, y1});
    vis[x1][y1] = true;

    // BFS搜索
    while (q.size()) {
        pair<int, int> fr = q.front();

        // 如果当前位置是目标位置,跳出循环
        if (fr.first == x2 && fr.second == y2) break;

        // 出队
        q.pop();

        // 遍历四个方向的邻居
        for (int i = 0; i < 4; ++i) {
            int dx = fr.first + X[i];
            int dy = fr.second + Y[i];

            // 检查邻居是否在网格范围内
            if (dx < 1 || dx > n || dy < 1 || dy > m) continue;

            // 检查邻居是否已经访问过或者是障碍物
            if (vis[dx][dy] || mp[dx][dy]) continue;

            // 入队
            q.push({dx, dy});

            // 更新距离数组
            siz[dx][dy] = siz[fr.first][fr.second] + 1;

            // 标记邻居已访问
            vis[dx][dy] = true;
        }
    }

    // 输出从起始位置到目标位置的最小距离
    printf("%d\n", siz[x2][y2] + 1);
  
    return 0;
}

java版代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    static final int N = 1010;
    static int[][] mp = new int[N][N];
    static int[][] siz = new int[N][N];
    static boolean[][] vis = new boolean[N][N];

    static int[] X = {1, 0, -1, 0};
    static int[] Y = {0, 1, 0, -1};

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入行数和列数
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        // 输入网格矩阵
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                mp[i][j] = scanner.nextInt();
            }
        }

        // 输入起始和目标位置
        int x1 = scanner.nextInt();
        int y1 = scanner.nextInt();
        int x2 = scanner.nextInt();
        int y2 = scanner.nextInt();

        // 创建队列进行广度优先搜索(BFS)
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{x1, y1});
        vis[x1][y1] = true;

        // BFS搜索
        while (!q.isEmpty()) {
            int[] fr = q.poll();

            // 如果当前位置是目标位置,跳出循环
            if (fr[0] == x2 && fr[1] == y2) break;

            // 遍历四个方向的邻居
            for (int i = 0; i < 4; ++i) {
                int dx = fr[0] + X[i];
                int dy = fr[1] + Y[i];

                // 检查邻居是否在网格范围内
                if (dx < 1 || dx > n || dy < 1 || dy > m) continue;

                // 检查邻居是否已经访问过或者是障碍物
                if (vis[dx][dy] || mp[dx][dy] == 1) continue;

                // 入队
                q.offer(new int[]{dx, dy});

                // 更新距离数组
                siz[dx][dy] = siz[fr[0]][fr[1]] + 1;

                // 标记邻居已访问
                vis[dx][dy] = true;
            }
        }

        // 输出从起始位置到目标位置的最小距离
        System.out.println(siz[x2][y2] + 1);
    }
}

标签:10,fr,int,vis,电路,布线,dx,dy
From: https://www.cnblogs.com/aslwr/p/710-circuit-wiring-junkg.html

相关文章

  • 代码随想录算法训练营第十一天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150
    一、20.有效的括号题目链接:LeetCode20.有效的括号学习前:思路:当前元素为左括号,直接入栈当前元素为右括号,若找到对应的左括号匹配,则循环继续;反之返回false若栈为空,返回true;反之false时间复杂度:O(n)空间复杂度:O(n)学习后:采用入栈右括号,降低复杂度。即当遇到左......
  • 模拟集成电路设计系列博客—— 4.4.2 固定跨导电路修调
    4.4.2固定跨导电路修调如之前所讨论,如果不使用修调,比值\(G_m/C\)可能会有百分之30的误差。然而,集成电容的误差一般在这百分之30的误差中只贡献百分之10。因此,对于能够容忍百分之10误差的应用,可以通过一个固定外部电阻来设置\(G_m\)值,如接下来我们所看到的,修调一个\(G_m\)值并不......
  • 【题解】洛谷P1068 [NOIP2009 普及组] 分数线划定 (map)
    ##题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的$150\%$划定,即如果计划录取$m$名志愿者,则面试分数线为排名第$m\times150\%$(向......
  • 模拟集成电路设计系列博客—— 4.4.1 修调概述
    4.4.1修调概述如之前所说,连续时间滤波器的一个缺点是需要额外的修调电路。这是因为由于时间常数会因为工艺偏差而产生大的波动。例如,集成电容可能会有百分之10的偏差,而电阻和跨导可能会有约百分之20的偏差。由于这些组件的构建非常不同,RC或者\(Gm/C\)时间常数积由于工艺偏差可能......
  • CF1055F Tree and XOR
    这道题代码虽然比较短,但花了我整整一天才过,太菜了这是CF241B的加强版,但是有点不同,因为CF241B后半部分求前\(k\)大的和没法优化了,而这道题能把前面的求第\(k\)小时间复杂度优化到单log,但是需要注意这道题开trie完全开不下,所以肯定没法trie上二分做到单log对于某些......
  • 牛客2022多校DAY10-K You are given a tree
    「牛客2022多校DAY10-K」Youaregivenatree...简要题意给一棵带点权和边权的树,找到至多\(k\)个点权不同的点,使得它们之间路径覆盖的边权和最大。\(n\le5000,k\le5\)。Solution考虑颜色数量不大的时候怎么暴力。显然可以直接状压DP,压一下当前选择的颜色集合为\(S\),......
  • 模拟集成电路设计系列博客—— 4.3.3 四晶体管MOSFET-C积分器
    4.3.3四晶体管MOSFET-C积分器一种改进MOSFET-C滤波器线性度的方式是使用四晶体管MOSFET-C积分器,如下图所示[Czarnul,1986]:对于这个四晶体管积分器的小信号分析,可以将单输入积分器处理成有着\((v_{pi}-v_{ni})\)和反相信号\((v_{ni}-v_{pi})\)两个输入信号的双输入积分器。基于......
  • 最大工作频率为32MHz,R7F100GPL2DFA、R7F100GPL3CFA低功耗MCU,10M08SAU169C8GGB MAX® 1
    一、RL78/G23 新一代RL78微控制器,最大工作频率为32MHz,外围功能得到进一步扩展,低功耗性能也有所提升。RL78/G23微控制器是RL78系列的新一代产品,CPU工作时的功耗为41μA/MHz,STOP(保持4KBSRAM)时的功耗为210nA,其低功耗在业内首屈一指。此外,由于采用SNOOZE模式定序器,它还能大幅度减少......
  • 新一代RL78微控制器,R7F100GPJ2DFA和R7F100GPJ3CFA低功耗MCU、32MHz
    概览RL78/G23低功耗MCU可在41μA/MHzCPU运行频率下工作,功耗低,停止4KBSRAM保持时为210nA。该MCU设有snooze模式排序器,可显著降低间歇工作时的功耗。RL78/G23组具有1.6V至5.5V宽工作电压范围,频率高达32MHz。它们还具有30引脚至128引脚各种封装引脚数和高达768KB闪存。除了增强的模......
  • 模拟集成电路设计系列博客——4.3.2 双晶体管MOSFET-C积分器
    4.3.2双晶体管MOSFET-C积分器MOSFET-C滤波器类似于全差分有源RC滤波器,除了电阻被等效的线性区MOS晶体管所取代。由于有源RC和MOSFET-C滤波器紧密关联,对于设计者来说,一个好处就是可以大量使用在有源RC滤波器上的已有知识。本小节我们讨论双晶体管MOSFET-C积分器。一个双晶体管MO......