題意:在M*N的矩陣中,每個元素為0或1,現在問你能否找到若干行,使得每一列只有1個1.
思路:bfs + 優先隊列
原始碼:
#include <iostream><br />#include <cstring><br />#include <cstdio><br />#include <queue><br />using namespace std;<br />const int MAXN = 17;<br />const int MAXM = 301;<br />int matrix[MAXN][MAXM];<br />int link[MAXN][MAXN];//判斷i行和j行能否組合<br />int rowCnt[MAXN];//rowCnt判斷i行中1的總數<br />int m, n;<br />struct node_T {<br /> int row[MAXN];//記錄已經合并哪些行<br /> int rCnt;//記錄行的記錄數<br /> int cnt;//記錄列中1的總數<br /> bool operator < (const node_T &nod) const//運算子多載<br /> {<br /> return cnt < nod.cnt;<br /> }<br />};<br />bool bfs()<br /> {<br /> priority_queue<node_T> Q;//優先順序隊列<br /> node_T cur, tmp;<br /> int i, j;<br /> for(i = 0; i < m; i ++)<br /> {<br /> cur.row[0] = i;//初始化隊列,每行入隊列<br /> cur.rCnt = 1;<br /> cur.cnt = rowCnt[i];<br /> Q.push(cur);<br /> }<br /> while(! Q.empty())<br /> {<br /> cur = Q.top();<br /> Q.pop();<br /> if(cur.cnt == n)<br /> return true;<br /> tmp = cur;<br /> for(i = cur.row[cur.rCnt - 1] + 1; i < m; i ++)<br /> {<br /> for(j = 0; j < cur.rCnt; j ++)<br /> {<br /> if(! link[i][cur.row[j]])//兩行可以放在一起<br /> break;<br /> }<br /> if(j == cur.rCnt)<br /> {<br /> tmp.rCnt = cur.rCnt + 1;//添加一行到結構中,記錄在結構中<br /> tmp.row[tmp.rCnt - 1] = i;<br /> tmp.cnt = cur.cnt + rowCnt[i];<br /> Q.push(tmp);//排入佇列中<br /> }<br /> }<br /> }<br /> return false;<br />}<br />int main()<br />{<br /> int i, j, k;<br /> while(scanf("%d%d", &m, &n) != EOF)<br /> {<br /> memset(rowCnt, 0, sizeof(rowCnt));<br /> for(i = 0; i < m; i ++)<br /> {<br /> for(j = 0; j < n; j ++)<br /> {<br /> scanf("%d", &matrix[i][j]);<br /> rowCnt[i] += matrix[i][j];<br /> }<br /> }<br /> for(i = 0; i < m; i ++)<br /> {<br /> link[i][i] = 0;<br /> for(j = i + 1; j < m; j ++)<br /> {<br /> for(k = 0; k < n; k ++)<br /> {<br /> if(matrix[i][k] & matrix[j][k]) break;<br /> }<br /> if(k < n)<br /> {<br /> link[i][j] = link[j][i] = 0;<br /> }<br /> else<br /> {<br /> link[i][j] = link[j][i] = 1;<br /> }<br /> }<br /> }<br /> if(bfs())<br /> printf("Yes, I found it/n");<br /> else<br /> printf("It is impossible/n");<br /> }<br /> return(0);<br />}