原本是做贪心的题目的,但这道题不知道怎么贪心,看了洞庭散人的代码.就盗了过来.对于每一个点K都早出他的maxNum,比较得出最大的
maxNum。 通过 k 确定坐标的方法 x=k/n;y=k%n; 通过回溯球的最后的解~!
#include <iostream> using namespace std; char map[4][4]; int maxNum,n; bool search(int row,int col) { int i; for (i = row-1; i >= 0; --i) { if (map[i][col] == 'O') return false; if (map[i][col] == 'X') break; } for (i = col-1; i >= 0; --i) { if (map[row][i] == 'O') return false; if (map[row][i] == 'X') break; } return true; } void Solve(int k,int curNum) { int x,y; if(k==n*n) { if(curNum>maxNum) { maxNum=curNum; return; } } else { x=k/n;//行号 y=k%n;//列号 if((map[x][y]=='.')&&(search(x,y)==true)) {//当前点是空白处,并且可以放置碉堡 map[x][y]='O';//放置碉堡 Solve(k+1,curNum+1);//递归进入下一个位置 map[x][y]='.';//回溯 } //当前点不能放置或回溯回来 Solve(k+1,curNum); } } int main() { int i,j; while(cin>>n && n) { for (i=0;i<n;i++) { for (j=0;j<n;j++) { cin>>map[i][j]; } } maxNum=0; Solve(0,0); cout<<maxNum<<endl; } return 0; }