用dfs来做~~但注意每次dfs回来后需要恢复到进入dfs前的状态。。。
/** map 0表示无wall houseblock 1表示 houseblock -1表示wall flagr 0 表示指定行无wall houseblock 1表示指定行有houseblock -1表示指定行有wall 当指定行有wall时,优先级最高,一定为-1; flagc 与flagr相近 对列的描述 根据flag* 标记情况来对一些情况进行筛选 **/ #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int map[4][4],flagr[4],flagc[4],s,n,maxs; void print() { int i,j; cout<<"$$$$$$\n"; for(i=0;i<n;i++){ for(j=0;j<n;j++) cout<<map[i][j]<<" "; cout<<endl; } cout<<endl; for(i=0;i<n;i++){ cout<<flagr[i]<<" "; } cout<<endl; for(i=0;i<n;i++){ cout<<flagc[i]<<" "; } cout<<endl; cout<<"@@@@@@\n\n"; } //判断 x,y位置是否可以放置houseblock int check(int x,int y){ int i,j; //行中有墙的情况 if(flagr[x]==-1){ for(j=y-1;j>=0;j--){ if(map[x][j]){ if(map[x][j]==1)return 0; break; } } for(j=y+1;j<n;j++) if(map[x][j]){ if(map[x][j]==1)return 0; break; } } //列中有墙的情况 if(flagc[y]==-1){ for(i=x-1;i>=0;i--){ if(map[i][y]){ if(map[i][y]==1)return 0; break; } } for(i=x+1;i<n;i++) if(map[i][y]){ if(map[i][y]==1)return 0; break; } } return 1; } void dfs(){ int i,j,tempr,tempc; for(i=0;i<n;i++){ if(flagr[i]!=1){ for(j=0;j<n;j++) if(flagc[j]!=1&&!map[i][j]&&check(i,j)){ //修改状态 s++; map[i][j]=1; if(!flagr[i])flagr[i]=1; if(!flagc[j])flagc[j]=1; //print(); dfs(); //恢复状态 s--; map[i][j]=0; if(flagr[i]==1)flagr[i]=0; if(flagc[j]==1)flagc[j]=0; } } } if(maxs<s)maxs=s; } int main() { int i,j,tempc,tempr; char x; while(cin>>n,n){ for(i=0;i<n;i++)flagr[i]=flagc[i]=0; for(i=0;i<n;i++) { getchar(); for(j=0;j<n;j++) { cin>>x; if(x==‘.‘){ map[i][j]=0; }else{ map[i][j]=-1; flagr[i]=-1; flagc[j]=-1; } } } s=maxs=0; dfs(); cout<<maxs<<endl; } return 0; }