- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在努力提高 C++ 的水平,所以我一直在解决为编程竞赛设计的问题。几天前我开始了这个问题,并且无法终生解决。我的算法以及如何修复它需要一些帮助。这是问题所在:ACM Image Compression problem
我的代码:我在下面进行了解释。
#include "Compress.h"
using namespace std;
Compress::Compress(){
size = 0, threshold = 0, nRows=0, nCols=0;
// Enter in a file name
cout << "Welcome. Please type in the name of the file to read the numbers.\n";
cin >> readFileName;
inFile.open(readFileName.c_str());
if(!inFile.is_open()) {
cout << "Failed to open the file! Press Enter to exit..." << endl;
exit(1);
}
//Finding the array size and threshold
inFile >> size >> threshold;
nRows = size;
nCols = size;
topright = size;
bottomleft = size;
//Let's make the array
// creating the columns
compressArray = new int* [nCols];
// creating the rows
for (int r = 0; r < nRows; r++){
compressArray[r] = new int[nRows];
}
// FIll the array
for (int i = 0; i < nRows; i++){
for (int j = 0; j < nCols; j++){
inFile >> compressArray[i][j];
}
}
inFile.close();
// Show before editing.
print();
work(0, nRows, 0, nCols);
}
Compress::~Compress(){
for (int i = 0; i < nRows; i ++){
delete compressArray[i];
}
delete [] compressArray;
}
void Compress::work(int start_x, int end_x, int start_y, int end_y){
int nb_blacks = 0;
int nb_whites = 0;
int total_blocks = 0;
int majority = 0;
int percent = 0;
cout << start_x << end_x << start_y << end_y << "\n------\n";
for(int i = start_x; i < end_x; i++){
for(int j = start_y; j < end_y; j++){
if(compressArray[i][j] == 1){
nb_blacks++;
}
}
}
total_blocks = ((end_x - start_x) * (end_y - start_y));
nb_whites = total_blocks - nb_blacks;
// give the max back
majority = max(nb_blacks, nb_whites);
// find the percent of the highest amount of colored blocks.
percent = ((majority*100)/total_blocks);
cout << "\n----\nPercent: " << percent << " Threshold: " << threshold << endl;
// majority/total_blocks is determining the percent of the greater
// color in the box. We are comparing it to the threshold percent.
if (percent >= threshold){
for(int i = start_x; i < end_x; i++){
for(int j = start_y; j < end_y; j++){
if(nb_blacks > nb_whites) compressArray[i][j] = 1;
else compressArray[i][j] = 0;
}
}
}
else {
topright = topright/2;
bottomleft = bottomleft/2;
work(start_x, (end_x/2), (topright), end_y);
work(start_x, (end_x/2), start_y, (end_y/2));
work((bottomleft), end_x, start_y, (end_y/2));
work((bottomleft), end_x, (topright), end_y);
}
}
void Compress::print(){
for (int r = 0; r < nRows; r++){
for (int c = 0; c < nCols; c++){
cout << compressArray[r][c];
}
cout << endl;
}
}
因此,我的程序所做的是计算图像中黑色方 block 的数量(1 个)。然后将其与白色方 block (0)的数量进行比较。以较大者为准,根据图像中的方 block 数量转换为百分比。它将它与阈值进行比较。如果阈值小于百分比......整个图像变成了多数颜色。
如果阈值更高...它分成四个递归部分并放大。它将从右上角开始,然后是左上角、左下角和右下角。
我的程序适用于 4 x 4 的正方形,因为它可以正确地分成四个部分。然而,对于 8 x 8 的正方形...如果需要将其分成小于四个部分,一切都会变得一团糟。
我知道它为什么这样做。我放大递归函数的算法是错误的。如果正方形是 8 x 8...参数将类似于
0, 8, 0, 8 = looking at the whole square
0, 4, 4, 8 = the top right
corner using a 4 by 4 0, 2, 6, 8 = looking at the smallest top right
square of a 2 by 2.
我只是不知道可以满足我需要的数学函数。我不知道如何为 8 x 8 的正方形解决这个问题。我的代码甚至可以修复吗?或者我需要想出另一种方法吗?如果是,怎么办?
谢谢
最佳答案
修复了!数学函数只是一种痛苦。
标题函数
#include<cstdlib>
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class Compress{
public:
Compress();
~Compress();
void input();
void work(int start_x, int end_x, int start_y, int end_y);
void print();
private:
int size;
int threshold;
int** compressArray;
int nRows, nCols;
string readFileName;
ifstream inFile;
};
CPP 文件
#include "Compress.h"
using namespace std;
Compress::Compress(){
size = 0, threshold = 0, nRows=0, nCols=0;
// Enter in a file name
cout << "Welcome. Please type in the name of the file to read the numbers.\n";
cin >> readFileName;
// Open the file.
inFile.open(readFileName.c_str());
if(!inFile.is_open()) {
cout << "Failed to open the file! Press Enter to exit..." << endl;
exit(1);
}
//Finding the array size and threshold
inFile >> size;
nRows = size;
nCols = size;
// Enter a threshold.
cout << "Enter the desired threshold between 50-100: ";
cin >> threshold;
// Keep asking for the desired threshold until it is given.
while (threshold < 50 || threshold > 100){
cout << "\nIncorrect Threshold.\n";
cout << "Enter the desired threshold between 50-100: ";
cin >> threshold;
}
//Let's make the array
// creating the columns
compressArray = new int* [nCols];
// creating the rows
for (int r = 0; r < nRows; r++){
compressArray[r] = new int[nCols];
}
// FIll the array
for (int i = 0; i < nRows; i++){
for (int j = 0; j < nCols; j++){
inFile >> compressArray[i][j];
}
}
inFile.close();
// Show before editing.
print();
work(0, nRows, 0, nCols);
}
Compress::~Compress(){
for (int i = 0; i < nRows; i ++){
delete compressArray[i];
}
delete [] compressArray;
}
void Compress::work(int start_x, int end_x, int start_y, int end_y){
int Size = end_y - start_y; // Finding the midpoints.
int nb_blacks = 0;
int nb_whites = 0;
int total_blocks = 0;
int majority = 0;
int percent = 0;
// Testing everything.
// cout << "\nx1, y1: " << start_x << "," << start_y << " x2,y2: " << end_x << "," << end_y << endl;
// for (int r = start_x; r < end_x; r++){
// for (int c = start_y; c < end_y; c++){
// cout << compressArray[r][c];
// }
// cout << endl;
// }
// Initial case. If 1, break and start returning results
if (end_x <= start_x || end_y <= start_y){
return;
}
// Keep breaking it down until it reaches 1.
else {
// Count the Number of Black pieces
for(int i = start_x; i < end_x; i++){
for(int j = start_y; j < end_y; j++){
if(compressArray[i][j] == 1){
nb_blacks++;
}
}
}
// Find the total and number of white pieces.
total_blocks = ((end_x - start_x) * (end_y - start_y));
nb_whites = total_blocks - nb_blacks;
// give the max back
majority = max(nb_blacks, nb_whites);
// find the percent of the highest amount of colored blocks.
percent = ((majority*100)/total_blocks);
// cout << "Percent: " << percent << " Threshold: " << threshold << "\n-----\n";
// majority/total_blocks is determining the percent of the greater
// color in the box. We are comparing it to the threshold percent.
if (percent >= threshold){
for(int i = start_x; i < end_x; i++){
for(int j = start_y; j < end_y; j++){
if(nb_blacks > nb_whites) compressArray[i][j] = 1;
else compressArray[i][j] = 0;
}
}
}
// Keep breaking down until we reach the initial case.
else {
work((end_x - (Size/2)), (end_x), (start_y), (start_y + (Size/2)));
work(start_x, (start_x + (Size/2)), (start_y), (start_y + (Size/2)));
work((start_x), (start_x + (Size/2)), (end_y - (Size/2)), end_y);
work((end_x - (Size/2)), end_x, (end_y - (Size/2)), end_y);
//
// work((start_x), (mid_x), (mid_y), end_y);
// work(start_x, (mid_x ), (start_y), (mid_y));
// work((mid_x), end_x, start_y, (mid_y));
// work((mid_x), end_x, (mid_y), end_y);
}
}
}
void Compress::print(){
// Print the function
cout << "\nImage: " << threshold << "%\n";
for (int r = 0; r < nRows; r++){
for (int c = 0; c < nCols; c++){
cout << compressArray[r][c];
}
cout << endl;
}
}
关于c++ - ACM图像压缩算法C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13262849/
完整的错误消息是: 403 urn:acme:error:unauthorized: Account creation on ACMEv1 isdisabled. Please upgrade you
我们正在使用 EKS 和 Nginx-ingress(NLB)。我正在尝试在 NLB 的 AWS-load-balancer-SSL-cert 注释中配置多个 AWS ACM 证书。但没有运气。如果可
acme DNSapi acme DNSapi的作用是在申请证书时使用dns交易,acme可以通过dnsapi在对应的dns管理平台提交对应的dns记录。玩过证书的朋友都知道,证书申请时有三种验证方
我的应用程序运行在EKS上,该服务器正在使用istio-ingressgateway服务为端口15020、15032、15031、15029、15030、15443的负载均衡器。我想在此ELB上终止S
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
下面是我从链接 http://progspedia.blogspot.com/2011/05/679-dropping-balls.html#comment-form 复制的代码 #include i
我正在尝试使用 Swing 和 ACM 交互器制作一个非常简单的程序。它直接取自类讲义,但在我的电脑上不起作用。当我运行它时,它可以正常运行大约半秒钟,然后短暂闪烁、重新加载,然后所有按钮和文本字段功
我正在尝试使用 Swing 和 ACM 交互器制作一个非常简单的程序。它直接取自类讲义,但在我的电脑上不起作用。当我运行它时,它可以正常运行大约半秒钟,然后短暂闪烁、重新加载,然后所有按钮和文本字段功
我是Java新手!!! :) 现在,我只是对 ACM 库的对象及其函数感到困惑。我想创建一个颜色为绿色的 GRect。所以我可能会这样做: GRect rect = new GRect(0, 0, 5
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: Can you answer this 2009 ACM International Collegiate Prog
我被选中参加 ACM ICPC 区域决赛。但是我只剩下 1 周的准备时间了。我已经为此准备了 1 年,但由于我的考试,我在过去两周不能花太多时间在编程上。 有人可以发布一些链接吗,我可以在其中找到涵盖
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我正在尝试找出如何解决 ACM ICPC final 之一的问题(从 2012 年开始,所以我猜是最近的)。它称为 Fibonacci Words,描述为 here在问题 D 下。 我认为我非常接近,
我正在尝试在 Eclipse 中编写一个 java 应用程序。 我真的很想使用 ACM.Program 包,但是,我的 Eclipse 副本没有安装它! 我在网上找遍了,找不到一个 ACM 包的下载。
在使用 vi 15 年的大部分时间后,我在使用 Go 时一时兴起尝试了 Rob Pike 的 Acme。我真的很喜欢它的小巧轻便。现代 unix 风格的东西在 Acme 中表现不佳,而 Ruby 开发
您好! 我在查找出现此错误的原因时遇到了问题。尝试用谷歌搜索它。这似乎是从容器中查找 dns 的问题。 traefik 日志错误: time="2020-01-30T12:12:12+01:00" l
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) thr
我目前正在将我的硕士论文放入 latex ACM 模板中,我有一个大表,我希望其中不同的行具有不同的颜色。现在我知道这通常是使用以下方法完成的: \rowcolor{Yellow} 现在我使用 ACM
我是这个网站的新手,对 Java 也比较陌生。 我创建了一个 Java 应用程序,它使用 ACM 图形包并扩展了 GraphicsProgram 。我现在希望能够将图形输出窗口的内容转换为图像文件,例
我目前正在阅读 Eric Robert 的Java 艺术与科学,其中使用了 ACM Java 库。其中一项练习要求学生构建 Breakout 的克隆版本。我对对象的动画有疑问,所以请看一下这段代码,如
我是一名优秀的程序员,十分优秀!