問題描述
簡單思路
計算機影象處理演算法經常遇到同色方塊識別問題。給定乙個彩色影象的顏色矩陣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...