/*
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1162

本题妙处:
用一个数对行取商是行的坐标 对行取余是列的坐标;
注意: 二位数组必须从[0][0]开始,并且这个数也是从零开始的;

以前做的题目都是在for循环里面进行递归

*/

include

include

include

include

include

include

include

using namespace std;
char diaoBao[5][5];
int m,min1=0;
bool isFang(int x,int y)
{
for(int i=x-1; i>=0; i--)
{
if(diaoBao[i][y]=='0')//此点是否和以前放置的点冲突,0代表此行和它离的最近的点已经放置过直接返回假值
return false;
if(diaoBao[i][y]=='X')//遇到墙了,说明此行可以放置退出 看看列是否能放置
break;
}
for(int i=y-1; i>=0; i--)// 列
{
if(diaoBao[x][i]=='0')
return false;
if(diaoBao[x][i]=='X')
break;
}
return true;
}
void dfs(int cur,int s)
{
if(cur==m*m)
{
if(s>min1)
min1=s;
return;
}
int x=cur/m;//行的坐标
int y=cur%m;//列的坐标

if(diaoBao[x][y]=='.'&&isFang(x,y))//满足条件能够放置
{
    diaoBao[x][y]='0';
    dfs(cur+1,s+1);//能够放置的条件下  s+1
    diaoBao[x][y]='.';
}
dfs(cur+1,s);//注意:  前面不能加 else  不满足条件的情况下s不再加1   但是在满足条件下上一步已经执行了,这一步只是起到
                 //向下一步继续扩展不影响s的值

}
int main()
{
while(scanf("%d",&m),m)
{
min1=0;
memset(diaoBao,'.',sizeof(diaoBao));
for(int i=0; i<m; i++)
scanf("%s",diaoBao[i]);
dfs(0,0);
printf("%d\n",min1);
}
return 0;
}

最新文章

  1. php链接数据库 批量删除 和 注册审核
  2. SDOI2009
  3. Struts与Struts2的区别
  4. ThinkPad L440 FN键设置
  5. Android Studio快捷键每日一练(6)
  6. 职责链(Chain of Responsibility)模式在航空货运中的运用实例
  7. step 4 GCD 队列演练
  8. ExtJS学习之路第一步:对比jQuery,认识ExtJS
  9. 八皇后问题 --- 递归解法 --- java代码
  10. hdu 4289 Control(最小割 + 拆点)
  11. 往github上传demo
  12. iWeb峰会见闻
  13. 《Javascript高级程序设计》读书笔记之闭包
  14. zabbix企业应用之bind dns监控(转)
  15. 基于GCC的openMP学习与测试(2)
  16. Mark Text - 下一代所见即所得的Markdown编辑器
  17. 【BZOJ3697】采药人的路径
  18. CSS魔法堂:那个被我们忽略的outline
  19. android开发之代码混淆
  20. java多线程15 :wait()和notify() 的生产者/消费者模式

热门文章

  1. JS escape()、encodeURI()和encodeURIComponent()的区别
  2. 读取xml字符串
  3. Activity和Fragment生命周期变化
  4. C#中byte[]与string的转换
  5. reflact中GetMethod方法的使用
  6. java_设计模式_命令模式_Command Pattern(2016-08-09)
  7. 判断奇数,java陷阱
  8. 系统默认字体Mac OS,Windows,XP,Lunix
  9. jQuery之文本框得失焦点
  10. Centos6.2_(64位)服务器环境配置:源码编译Nginx