分析:放过炮台的标记为‘ @ ‘(回溯要还原) 递归,下一次遍历时向四个方向延伸(一行或者一列),找到‘@‘ 则标记为不行,若找到‘X‘或边界则标记为行。
这题貌似还可以用二分匹配做。
#include<iostream> using namespace std; #define N 5 char map[N][N]; int dir[4][2]={-1,0,0,-1,1,0,0,1}; int n,max; bool judge(int x,int y) { int i,tx,ty; for(i=0;i<4;i++) { tx=x; ty=y; while(true) //一直往外延伸 { tx=tx+dir[i][0]; ty=ty+dir[i][1]; if(map[tx][ty]=='@') return false; else if(map[tx][ty]=='X') break; else if(tx< 1 || ty<1 || tx>n || ty>n) break; } } return true; } void dfs(int num) { int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][j]=='.' && judge(i,j)) { map[i][j]='@'; dfs(num+1); map[i][j]='.'; } if(max<num) //得到最大值 max=num; } int main() { int i,j; while(cin>>n,n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>map[i][j]; max=0; dfs(0); cout<<max<<endl; } return 0; }
原文地址:http://blog.csdn.net/a809146548/article/details/46362015