状态压缩
从讲完课开始写
一直写到三点
先是没有考虑结果可能为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++)
{
for(int j = 1;j < N+1;j++)
{
matrix[i][j]=0;
}
}
for(int i =1;i<K+1;i++)
{
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++)
{
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;
}
原文地址:http://www.cnblogs.com/Run-dream/p/3858467.html