zoj 1002 Fire Net
#include "stdio.h" int map[5][5],max,n;//map输入的地图,max最大碉堡数,n地图大小 bool set(int x,int y)//判断是否可以放置碉堡,只考虑当前空格左上角的情况 { int i; for(i=x-1; i>=0; i--) { if(map[i][y]=='X') break;//有墙,此行可以放置 if(map[i][y]=='!') return 0;//有碉堡,返回 } for(i=y-1; i>=0; i--) { if(map[x][i]=='X') break;//有墙,此列可以放置 if(map[x][i]=='!') return 0;//有碉堡,返回 } return 1;//可以放置 } void find(int k,int cnt)//dfs函数,k当前格子数,cnt当前碉堡数 { int x,y; if(k==n*n)//结束条件 { if(cnt>max) max=cnt; return; } else { x=k/n;//行号 y=k%n;//列号 if(set(x,y)&&map[x][y]=='.')//当前格子可以放 { map[x][y]='!';//标记放置的碉堡 find(k+1,cnt+1);//寻找下一个 map[x][y]='.';//恢复现场 } //当前格子不可以放或着不放(既这里加else会错),搜索下一个 find(k+1,cnt); } } int main() { int i,j; while(~scanf("%d",&n)) { if(n==0) break; getchar();//读入回车 for(i=0; i<n; i++) { for(j=0; j<n; j++) scanf("%c",&map[i][j]); getchar(); } max=0;//标记清零 find(0,0); printf("%d\n",max); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/