hdu 1045 zoj1002 八皇后问题 dfs

来源:互联网 发布:sql not like用法 编辑:程序博客网 时间:2024/05/21 16:57

题意:尽可能多的往棋盘上放城堡,因为城堡可以向上下左右射击,所以两个城堡不能在同一条x或者y上,但是墙壁可以挡住子弹,中间有墙的话就可以建多个城堡了。(讲的不是很清楚 题意还是自己去看比较好)

这个问题其实就是八皇后问题的更进一步,本来也就只是试试的想法做的,没想到 1A了。真是开心呀!


解题方法 : 回溯

http://acm.hdu.edu.cn/showproblem.php?pid=1045


#include<stdio.h>#include<string.h>char map[105][105];int a[105][105];int n;bool can(int x,int y)   // 判断这个位置能否放置城堡{int i;for(i=y-1;i>=0;i--)if(map[x][i]=='X') break;else if(map[x][i]=='K')return false;for(i=x-1;i>=0;i--)if(map[i][y]=='X') break;else if(map[i][y]=='K')return false;return true;}int max;void dfs(int y,int count){int i,j;if(count>max)max=count;for(j=y;j<n;j++)for(i=0;i<n;i++){if(map[j][i]!='K'&&map[j][i]!='X'&&can(j,i)){map[j][i]='K';  //将能放城堡的地方标记为Kcount++;dfs(j,count);count=0;    //开始的时候忘记了下面两句话,对dfs深搜还不熟练呀map[j][i]='.';}}}int main(){while(scanf("%d",&n)==1,n){getchar();int i;for(i=0;i<n;i++)gets(map[i]);memset(a,0,sizeof(a));max=-99;dfs(0,0);printf("%d\n",max); }return 0;}


原创粉丝点击