http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
题意:给出一个n,有n*n大小的城市,(.)表示空地,从碉堡(O)射出来的子弹可以前后左右四个方向发射,只有墙壁(X)可以挡住子弹,所以同一行同一列不能出现两座碉堡,除非它们中间有墙壁隔着,问最多能放多少座碉堡。
思路:一个个点遍历,看符不符合条件,符合条件座数+1然后继续下一点。
#include<iostream> using namespace std; char map[4][4]; int maxn,n; //对每一行每一列进行搜索 bool xinjudge(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 aasolve(int k,int c){ int x,y; if(k==n*n){ maxn=max(c,maxn); return ; } else{ x=k/n;//行数 y=k%n;//列数 if(map[x][y]=='.'&&xinjudge(x,y)){ map[x][y]='O';//如果可以则用‘O’替换掉 aasolve(k+1,c+1);//然后再搜索下一个 map[x][y]='.';//回溯寻找最大值 } aasolve(k+1,c);//如果那个点不行则搜索下一个点 } } int main(){ int i,j; while(scanf("%d",&n),n!=0){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ cin>>map[i][j]; } } maxn=0; aasolve(0,0); cout<<maxn<<endl; } return 0; }