HDU 1045 Fire Net
2015-07-25 11:06
274 查看
题目地址:点击打开链接
思路:好题
AC代码:
#include<iostream>
using namespace std;
int ibest,m;
char a[5][5];
bool canput(int x,int y)
{
int i;
for(i=y-1;i>=0;i--)
{
if(a[x][i]=='o')
return false;
if(a[x][i]=='X')
break;
}
for(i=x-1;i>=0;i--)
{
if(a[i][y]=='o')
return false;
if(a[i][y]=='X')
break;
}
return true;
}
void dfs(int k,int current)
{
int x,y;
if(k==m*m)
{
if(current>ibest)
ibest=current;
return;
}
x=k/m;//求出横坐标
y=k%m;//求出纵坐标
if(a[x][y]=='.'&&canput(x,y))
{
a[x][y]='o';//放一个炮
dfs(k+1,current+1);
a[x][y]='.';
}
dfs(k+1,current);//啥都不放
}
int main()
{
int i,j;
while(cin>>m&&m)
{
ibest=0;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
cin>>a[i][j];
}
dfs(0,0);
cout<<ibest<<endl;
}
return 0;
}
思路:好题
AC代码:
#include<iostream>
using namespace std;
int ibest,m;
char a[5][5];
bool canput(int x,int y)
{
int i;
for(i=y-1;i>=0;i--)
{
if(a[x][i]=='o')
return false;
if(a[x][i]=='X')
break;
}
for(i=x-1;i>=0;i--)
{
if(a[i][y]=='o')
return false;
if(a[i][y]=='X')
break;
}
return true;
}
void dfs(int k,int current)
{
int x,y;
if(k==m*m)
{
if(current>ibest)
ibest=current;
return;
}
x=k/m;//求出横坐标
y=k%m;//求出纵坐标
if(a[x][y]=='.'&&canput(x,y))
{
a[x][y]='o';//放一个炮
dfs(k+1,current+1);
a[x][y]='.';
}
dfs(k+1,current);//啥都不放
}
int main()
{
int i,j;
while(cin>>m&&m)
{
ibest=0;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
cin>>a[i][j];
}
dfs(0,0);
cout<<ibest<<endl;
}
return 0;
}
相关文章推荐
- Mysqli :multi->query
- 安装sql2000时提示“以前的某个程序安装已经在计算机上创建挂起的文件操作”的解决办法
- android 网络异步加载数据进度条
- Area of Interest
- #1127 : 二分图三·二分图最小点覆盖和最大独立集
- java常用API之查找字符串出现次数
- shell语法简介
- HDU 4772 Zhuge Liang's Password (简单模拟题)
- gsp页面标签
- Ubuntu的IP地址配置
- IOS开发中ARC下的assign和weak区别
- assert()函数用法总结
- iOS- CoreData 数据库管理利器!
- 项目加载不进去tomcat
- Java培训-ORACLE数据库学习【2】用户权限
- 撒娇女人最好命 --电影名
- HDU 1754 I Hate It (线段树)
- WinDbg-如何抓取dump文件
- 桥 Gym100712H Bridges
- hadoop2.4.1伪分布式搭建