程式設計練習 同色方塊識別問題

2021-07-23 03:53:03 字數 3104 閱讀 1154

問題描述

簡單思路

計算機影象處理演算法經常遇到同色方塊識別問題。給定乙個彩色影象的顏色矩陣c,彩色影象的位置在(i,j)處,畫素的顏色值是c[i][j],其中0≤

c[i]

[j]≤

k,0≤

i0≤j<

n ,程式設計以簡單二值影象為例,之後可以推導出其他量化空間尋找最小方塊,例如:

01000000

01000000

00011100

00011100

00011100

01000000

對於尋找指定元素(此處為1),應輸出最小子塊邊長為3,子塊左上角座標(3,3)。

對於本人非電腦科學專業出身,表述可能不專業,抱歉。個人感覺這種程式設計方法類似於數字影象處理中的積分圖,但因為目的是尋找特定元素最大正方形塊資訊,對於畫素值非特定尋找元素的處理與上面的積分圖有差別,可以說是一種遞迴+備忘錄記錄的動態規劃過程。

/*

首先給出矩陣維數n,m,之後給出矩陣amn的元素(好像其中只0,1,這裡通用輸入尋找key)和帶尋找元素key,求其中值為key的塊的最大邊長及位置

測試用例:

n=5,m=7

0 0 0 1 0 0 0

0 1 0 0 0 0 0

0 0 1 1 1 0 0

0 0 1 1 1 0 0

0 0 1 1 1 0 1

應該輸出最大邊框長度3,位置第3行,第3列

類似這種題

*/#include

#include

#include

#include

#include

using

namespace

std;

//函式定義

//模板類matrix標頭檔案定義

template

class matrix

//矩陣行數

int cols()const //矩陣列數

void resize(int rows, int cols); //重置矩陣大小

void print_matrix(ostream&out)const; //矩陣輸出

private:

int row, col; //矩陣行數和列數

vector

>mat; //向量表示的矩陣

};//定義自己的異常

class mymatindunboundexception:public exception

}myexcept;

//子函式實現功能

//建構函式

template

matrix::matrix(int rows, int cols, const t& value) :row(rows), col(cols), mat(rows,vector

(cols,value))

//提領函式

template

vector

& matrix::operator(int i)

template

const

vector

& matrix::operator(int i) const

//重置矩陣大小

template

void matrix::resize(int rows, int cols)

//列印矩陣元素

template

void matrix::print_matrix(ostream&out)const

cout

<< endl;

}cout

<< endl;}/*

三鄰域元素比較子函式,在maxsqurt子函式中呼叫

*/int minw(matrixmat, int i,int j)

/* 函式原型:void maxsqurt(matrixmat,const int key,int&foundrow,int&foundcol,int&locallongth)

輸入引數:matrixmat:輸入整體矩陣

const int key:輸入待尋找元素

輸出引數:int&foundrow:如果找到返回最大子塊右下角橫座標;否則返回0

int&foudncol:如果找到返回最大子塊右下角列座標;否則返回0

int&locallongth:返回子塊最大邊長

版本資訊:v1.0 authro:qiye005 data:2016.9.25

*/void maxsqurt(matrix mat,const

int key,int&foundrow,int&foundcol,int&locallongth)

for (int i = 0; i < c; i++)

for (int i = 1; i < r; i++)

else

if (mat[i][j]>locallongth)}}

}int main(void)

}//嘗試加入隨機擾動,數量不能多於定義最小子塊長度,此處選取 testlongth-1次加入隨機塊

for (int i = 0, tem = testlongth - 1; i < tem; i++)

//測試開始,首先列印輸入矩陣

mat.print_matrix(cout);

//開始尋找

cout

<< "程式開始"

<< endl;

maxsqurt(mat, specalele, foundrow, foundcol, locallongth);

//列印結果

cout

<< "最大塊邊長為"

<< locallongth << ","

<< "塊左上角橫座標為"

<< foundrow - locallongth+2

<< "塊左上角縱座標為"

<< foundcol - locallongth+2

<< endl;

}catch (exception ex)

return

0;}

同色不相鄰的方案數求解

有 n 種顏色的小球,每種顏色的小球有 a i 個,即一共有 sum n a i 個小球。現在要求把這些小球排同色不相鄰的方案數求解成一行,要求同種顏色的小球不相鄰。求方案數,答案對 10 9 7 取模。提交 web 下面的演算法都只考慮同色小球之間無區別的方案數。即可重排列的情況。如果同色小球之間...

60 同色三角形 15分

思路 這道題應該反著想,但是我就看著題目同色三角形,於是就想如何查詢同色,自己傻了,同色三角形的個數 總三角形的個數 異色三角形的個數 總三角形的個數就是在n各點中取3個點,就是n n 1 n 2 1 2 3 異色三角形就是先固定乙個點m for迴圈遍歷每個點 然後vector中v m 中儲存了與點...

前端練習09 同字母異序

同字母異序指的是兩個字串字母種類和字母的數量相同,但是順序可能不同。完成isanagram,接受兩個字串作為引數,返回true或者false表示這兩個字串是否同字母異序。例如 isanagram anagram nagaram return true.isanagram rat car return...