您的位置:首页 > 其它

hdu——4462(暴力枚举)

2013-08-23 19:38 295 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4462

解析:不知道为什么正确的程序被判成W了,后来再提交W的程序就过了。(囧啊)。

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define INF 0xfffffff
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a>b?b:a
#define N 50
#define M 100
struct Point{
int x,y,r;
}a
;
int n,k;
int visited[M][M];
int Abs(int t){
if(t<0) t=-t;
return t;
}
void Vis(int v){
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(visited[i][j]) continue;
if((Abs(i-a[v].x)+Abs(j-a[v].y))<=a[v].r) visited[i][j]=1;
}
}
void solve()
{
int ed=1<<k;
int min=INF;
for(int i=0;i<ed;i++){ //相当于dfs,枚举所有可能
memset(visited,0,sizeof(visited));
for(int j=0;j<k;j++)
visited[a[j].x][a[j].y]=1;
int mid=i,j=0,count=0;
while(mid>0){
if(mid&1)
{
Vis(count);
j++;
}
count++;
mid=mid/2;
}
if(j>=min) continue; //此时直接continue掉就可以
int flag=1;
for(int ii=1;ii<=n&&flag;ii++)
for(int jj=1;jj<=n;jj++)
if(!visited[ii][jj]){
flag=0;
break;
}
if(flag) min=j;
}
if(min==INF) cout<<"-1"<<endl;
else cout<<min<<endl;
}
int main()
{
int i,j;
while(cin>>n&&n){
cin>>k;
for(i=0;i<k;i++)
cin>>a[i].x>>a[i].y;
for(i=0;i<k;i++)
cin>>a[i].r;
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: