状态压缩
从讲完课开始写
一直写到三点
先是没有考虑结果可能为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