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; }