HDU 4462
状态压缩
从讲完课开始写
一直写到三点
先是没有考虑结果可能为0(都能放置稻草人的空地)
再是
鬼使神差地把题目看错
N*N是指点数而不是小格数
最后
莫名其妙的多出了个break
完美的做大死
现在整个人处于一种要疯癫的状态
上代码
#include <iostream>
using namespace std;
int ABS(int a)//绝对值
{
return (a>0)?a:a*(-1);
}
int main()
{
int N;
cin>>N;
while(N!=0)
{
int K;
cin>>K;
int *r = new int[K+1];
int *c = new int[K+1];
for(int i = 1; i < K+1; i++)
{
cin>>r[i]>>c[i];
}
int *R = new int[K+1];
for(int i = 1;i < K+1; i++)
{
cin>>R[i];
}
int matrix[51][51]= {0};
for(int i =1;i<N+1;i++)//把所有的初始化为0
{
for(int j = 1;j < N+1;j++)
{
matrix[i][j]=0;
}
}
for(int i =1;i<K+1;i++)//可以放置的点设为1(空地)
{
matrix[r[i]][c[i]]=1;
}
int ans = 99999999;
bool alrOk = true;
for(int a = 1;a<N+1;a++)//预判是否不用放
{
for(int b =1;b<N+1;b++)
{
if(matrix[a][b]==0)
{
alrOk = false;
break;
}
}
}
if(alrOk)
{
ans = 0;
}
for(int i = 0;i<=(1<<K)-1;i++)//用二进制来表示每个位置是否放置
{
int flag =0;
bool ok = true;
int grid[52][52] ={0};//由于运行时会修改数据所以新增一个来供修改(也可以不新增把前面那段初始化代码复制过来)
for(int e = 1;e<N+1;e++)
{
for(int f =1;f<N+1;f++)
{
grid[e][f]=matrix[e][f];
}
}
for(int j =0;j<K;j++)
{
if(i&(1<<j))//每位进行判断
{
flag++;
for(int a =1;a<N+1;a++)
{
for(int b =1;b<N+1;b++)
{
if(ABS(a-r[j+1])+ABS(b-c[j+1])<=R[j+1])
{
grid[a][b]=1;
}
}
}
}
}
for(int a = 1;a<N+1;a++)//check是否完全覆盖
{
for(int b =1;b<N+1;b++)
{
if(grid[a][b]==0)
{
ok = false;
break;
}
}
}
if(ok)
{
ans = flag<ans?flag:ans;
break;
}
}
if(ans==99999999)//无法覆盖
{
ans = -1;
}
cout<<ans<<endl;
cin>>N;
}
return 0;
}
浙公网安备 33010602011771号