好消息:周六上午不用上课了
坏消息:还要在家里考试
(考试前一天问了老师说可以骗分)
来看抽象F题:
电路布局布线 (Circuit Layout and Routing) 是电子设计自动化 (EDA) 领域的一个重要概念,它涉及到在电路板或集成电路上安排和连接电子元件的过程。这个过程的目标是在满足电气性能、信号完整性、电磁兼容性等要求的同时,实现对空间、成本和生产工艺的优化。
小小现在需要解决一个简化的电路布线问题,在一个 n × m 的方格中进行电路布线。其中:
井号 # 标记的格子已经被占用,不能布线。
加号 + 标记的格子会连接到电路的其他部分,必须被布线。在给定的电路布线问题中,至少有一个格子必须被布线。
点号 . 标记的格子小小有权选择是否布线:布线即将该格标记为加号,不布线即保持为点号。
小小的任务是选择尽可能多的格子进行布线 (将 “.” 的格子标记为 “+”),满足:
布线电路连通。即从任意一个已布线的格子,都能通过上、下、左、右移动到相邻已布线格子的方式,到达任意另一个布线的格子。
布线不存在短路 (回路),即不存在某个布线的格子能通过 > 2 步的上、下、左、右移动到相邻布线格子的方式回到自身,且经过的格子各不相同。
例如,以下是一个电路布线问题,已有三个格子被标记为必须布线 (加号): #....# ....+# .+#### .+...# 以下展示了一种合法和两种不合法的布线方案:
+.+.#
.+..#
++..#
+++++#
合法
..+++#
.++++#
.+####
.+####
不连通
.+####
.++++#
.+...#
.+...#
有回路
输入
输入第一行是两个空格分隔的整数 n 和 m,代表布线问题格子的行数和列数。 接下来 n 行,每行 m 个字符 (#, +, . 中的一个),描述了具体的布线问题。 输入数据保证至少存在一种合法的布线方案。输入数据中至少有一个 +。
输出
输出 n 行,每行 m 个字符,代表最优的布线方案,其中被布线的格子尽可能多。如有多种可能的方案,输出任意一种即可。
提示
数据规模 对于 40% 的数据,满足 n × m ≤ 16。 对于 100% 的数据,满足 n, m ≤ 6。 评分标准 在你的布线方案合法 (连通且无回路) 的前提下: 如果你的方案是最优布线方案,即布线的格子最多,该测试点得满分。 否则,该测试点得一半分数。
一开始没想到算法,先写了个骗分程序以防自己想不出来,骗分思路如下:
测试点中可能存在“+”已经连通的状况,这时候直接输出原表就是合法情况,得到一般分数(万一运气好点,给出的就是最优还能拿满)
然后写出骗分代码:
#include <bits/stdc++.h>
using namespace std;
char g[35][35];
int main()
{int m, n;scanf("%d%d", &m, &n);for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)scanf("%c", &g[i][j]);for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++)printf("%c", g[i][j]);printf("\n");}return 0;
}
然后:正确AC:100(为啥这平台显示方式特殊一点)
我:不是哥们.jpg