| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
|---|---|---|---|---|---|
| Explode 'Em All | ★★☆☆☆ | 答案正确 | 100 | 2015-2-5 17:28:50 | 超时(41) |
(AC 360)
给一个地图,问最少放几个炸弹可以把星号都消掉(炸弹炸掉当行当列):
.......... ..***..*.* .*.......* .*.......* .*.......* .....***** .......... .........*
神烦的一题。
| 527.cpp代码已折叠
展开折叠内容
|
|---|
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
#define ci const int &
int n,m,deep=1<<30;
int a[30]={},Count[1<<25]={};
void dfs(ci _at,ci _r,ci _count)
{
//到达条件//
if(_at>n)
{
if(Count[_r]<=_count)
deep=min(deep,_count);
return;
}
//继续搜索
dfs(_at+1,_r|a[_at],_count);
dfs(_at+1,_r,_count+1);
}
int main()
{
scanf("%d %d\n",&n,&m);
//预处理:Count[i]表示二进制数i中1的个数//
for(int i=0;i<(1<<m);++i)
Count[i]=Count[i>>1]+(i&1);
//录入//
for(int i=1;i<=n;++i)
{
for(int j=0;j<m ;++j )
{
char c;
scanf("%c",&c);
if(c=='*')
a[i]|=1<<j;
}
getchar();
}
//深搜//
dfs(1,0,0);
printf("%d",deep);
return 0;
}
|