引用参考http://www.cnblogs.com/phinecos/archive/2008/09/18/1293017.html
深度优先遍历(递归)
1 #include<iostream> 2 using namespace std; 3 4 //地图 5 char map[4][4]; 6 //max最大值,n地图边 7 int max=0,n=0; 8 //记录每次的最大值,太小了oj不过 9 int countmax[1000]; 10 11 //判断是否可以放置碉堡 12 bool CanPut(int row,int col) 13 { 14 //判断一列 15 for (int i = row - 1; i >= 0; i--) 16 { 17 if (map[i][col] == 'O') return false; 18 if (map[i][col] == 'X') break; 19 } 20 21 //判断一行 22 for (int i = col - 1; i >= 0; i--) 23 { 24 if (map[row][i] == 'O') return false; 25 if (map[row][i] == 'X') break; 26 } 27 return true; 28 } 29 30 //k当前第几格,curMax当前最大 31 int Solve(int k, int curMax) 32 { 33 int x = k / n;//行 34 int y = k % n;//列 35 if (k == n*n) 36 { 37 //判断当前最是否为最大 38 if (curMax > ::max) 39 { 40 ::max = curMax; 41 return 0; 42 } 43 } 44 else 45 { 46 //当前格为'.'并可以放置 47 if ((map[x][y] == '.' && (CanPut(x, y)))) 48 { 49 //可以放置 50 map[x][y] = 'O'; 51 //判断下一个 52 Solve(k + 1, curMax+1); 53 //回溯 54 map[x][y] = '.'; 55 } 56 //当前格不能放置或回溯,判断下一个 57 Solve(k + 1, curMax); 58 } 59 return 0; 60 } 61 62 int main() 63 { 64 int index = 0; 65 while ((cin >> n) && n) 66 { 67 //输入地图 68 for (int i = 0; i < n; i++) 69 for (int j = 0; j < n; j++) 70 { 71 cin >> map[i][j]; 72 } 73 //开始 74 Solve(0, 0); 75 76 countmax[index++] = ::max; 77 ::max = 0; 78 } 79 for (int i = 0; i < index; i++) 80 { 81 cout << countmax[i] << endl; 82 } 83 //system("pause"); 84 return 0; 85 }