暴搜 - 狀態壓縮 - Scaring the Birds - HDU - 4462
題意:
Sample Input:
4
2
2 2 3 3
1 3
4
2
2 2 3 3
1 4
0
Sample Output:
-1
1
數據範圍:
分析:
具體落實:
代碼:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#define P pair<int,int>
#define x first
#define y second
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=55,M=1<<10;
int n,m,r[N];
P v[15];
bool vis[N][N];
void dfs(int x,int y,int r)
{
for(int i=max(1,x-r);i<=min(x+r,n);i++)
for(int j=max(1,y-r);j<=min(y+r,n);j++)
if(abs(i-x)+abs(j-y)<=r)
vis[i][j]=true;
}
int main()
{
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
for(int i=0;i<m;i++) scanf("%d%d",&v[i].x,&v[i].y);
for(int i=0;i<m;i++) scanf("%d",&r[i]);
int ans=inf;
for(int i=0;i<M;i++)
{
memset(vis,false,sizeof vis);
for(int k=0;k<m;k++) vis[v[k].x][v[k].y]=true;
int cnt=0;
for(int j=0;j<m;j++)
if((i>>j)&1)
{
dfs(v[j].x,v[j].y,r[j]);
cnt++;
}
int tmp=0;
for(int k=1;k<=n;k++)
for(int j=1;j<=n;j++)
if(vis[k][j])
tmp++;
if(tmp==n*n) ans=min(ans,cnt);
}
if(ans!=inf) printf("%d\n",ans);
else puts("-1");
}
return 0;
}