問題描述:
有一塊布滿器件的電路板,器件共n行m列。每個器件只有兩種狀態,經一次雷射照射後狀態反轉。
初始時,器件的狀態隨機。雷射的位置在每列器件的最上方,這意味著照射一次,當前列中的所有器件的狀態全部反轉。(雷射可以多次照射同一列。)
當一行中的所有器件全為1時,本行處於導通狀態。
給定一塊電路板,並指定雷射照射次數,求最大導通行數。
限定:3≤行數n≤100,3≤列數m≤20,1≤雷射照射次數k≤m。
電路板可以使用0/1矩陣表示,0表示不導通態,1表示導通態。
輸入:n行×m列的0/1矩陣,及列反轉次數k。求經過k次列反轉後行全為1的最大行數。其中:3≤n≤100,3≤m≤20,1≤k≤m。必須反轉k次,同一列可以多次反轉。
例如,輸入是下圖所示的0/1矩陣,k=3。
1 0 0 1 0
1 1 0 0 0
0 1 1 1 0
0 0 0 1 1
1 0 1 0 1
1 1 0 0 0
輸出:2,即反轉3列,得到最多2行導通。
考慮k的奇偶性及一行中0的個數的奇偶性。最終變為排序問題。
實現**:
/*測試環境:vs2017*/
#include#includeusing namespace std;
int m,n,k;
int **a,**b,*num_0,*odd,*even,*com;
int maxcount=0,num=0;
void getdata()//依據輸入確定m和n的大小,並讀入資料
cout << "請輸入資料陣列:"<> a[i][j];
b[i][j] = a[i][j];
}}inline void trans(int **arr,int m)//列反轉
int judge(int **arr)//計算導通行數
} if(l)
count++;
} return count;
}void selectsort(int*arr,int len)
arr[i] = arr[index];
arr[index] = temp; }}
void count(int**arr)//計數每行0的個數存在num_0裡,0的個數為偶數且小於k的存於even,類似的奇數存於odd裡
for (int i = 0; i < n; i++)
selectsort(even, count0 );
selectsort(odd, count1 );
if (k % 2 == 0)
if (k % 2 == 1) }
void getresult()
cout << "最大導通數為:" << maxcount << endl;
}int main()
注:**中的排序並不是必要的,不排序也能直接實現;另一種方法是把篩選後的每一行都轉換成十進位制後再排序,找出相等的數的最大個數即為最大導通數。 電路板排列問題
一 問題描述 設b 是n塊電路板的集合。集合l 是這n塊電路板的m個連線塊。其中每個連線塊ni是b的乙個子集,且ni中的電路板用一根導線連線在一起。不同的連線快可能包含相同的電路板。設x是n塊電路板的乙個排列,則電路板的排列密度density x 定義為跨越相鄰電路板插槽的最大連線數。電路板排列問題...
新手焊接電路板 如何焊接電路板 焊電路板技巧有哪些
隨著工業化腳步的加快,很多領域都會使用電路板,說到這,不得不提到焊電路板,那焊電路板技巧有哪些呢?今天我們就通過下面的內容,一起來了解下焊電路板技巧的相關介紹。焊電路板技巧1 選擇性焊接的工藝流程包括 助焊劑噴塗,電路板預熱 浸焊和拖焊。助焊劑塗佈工藝在選擇性焊接中,助焊劑塗佈工序起著重要的作用。焊...
電路板除錯繼續
今天電路板除錯取得階段性進展,困惑了兩天的jtag和uart終於調通。原因居然是自己在焊接時有個引腳短接導致了短路。不過原理圖還是有問題的,jtag設計電源供電應該是3.3v,不知道當時自己為什麼會設計成5.0v。uart中max232 用得是1uf的電解電容,max3232用0.1uf的電容。不過...