首页 > 代码库 > HDU 4462
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++) { 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。