问题(简化过了):
偶数矩阵定义: 一个n*n矩阵中, 每个元素的上下左右之和为偶数.
给定n, 穷举(或算出1个数最多/最小等)偶数矩阵.
分析:
比较直接的想法是暴力穷举, n^n. 但这样n=30左右就吃不消了.
优化解法: 遍历第一行所有情况(n^2), 之后第二行可根据第一行算出来, 依次类推. 运算规模只有 2*(n^2)
#include <stdio.h> #include <stdlib.h> using namespace std; #define L 5 bool matrix[L][L]; bool minMt[L][L]; int n = L; bool val(int i, int j) { int sum = 0; if ( i < 1 ) return false; int row = i - 1, col = j; // 左 if ( col >= 1 ) sum += matrix[row][col-1]; // 上 if ( row >= 1) sum += matrix[row-1][col]; // 右 if ( col < n-1 ) sum += matrix[row][col+1]; return (sum % 2); } int main () { // 遍历第一行所有情况, 共n^2次 // 顺便利用位运算解决n层嵌套循环 int min = n*n; for ( int i = 2; i < n*2; i++ ) { int sum = 0; for ( int col = 0; col < n; col ++ ) { matrix[0][col] = ( i >> col ) % 2 ; sum += matrix[0][col]; } for ( int row = 1; row < n; row ++ ) { for ( int col = 0; col < n; col ++ ) { matrix[row][col] = val(row, col); sum += matrix[row][col]; } } if ( sum < min ) { min = sum; memcpy(minMt, matrix, sizeof(matrix)); } } printf("%d\n", min); for ( int row = 0; row < n; row ++ ) { for ( int col = 0; col < n; col ++ ) { printf("%d ", minMt[row][col]); } printf("\n"); } system("PAUSE"); return 0; }