hdu——4462(暴力枚举)

来源:互联网 发布:伺服控制需要编程吗 编辑:程序博客网 时间:2024/06/08 01:11

题目地址: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 100struct Point{int x,y,r;}a[N];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;}


原创粉丝点击