貌似提交了很多次
估计有段时间special judge挂了...
就WAWAWA...
tle于直接搜2^16*16
firstAC于2^15*16;
next AC 于 2^12*16
搜索剪枝还是很重要的!
#include<stdio.h>
const int search_size=1<<12;
int Cg(char x){
if(x=='+')return 1;
return 0;
}
void next(int &x,int &y){
if(y<4){y++;return;}
else {x++;y=1;return;}
}
int map[6][6],t[6][6];
void change(int x,int y){
int i;
for(i=1;i<=4;i++)t[i][y]=1-t[i][y];
for(i=1;i<=4;i++)t[x][i]=1-t[x][i];
t[x][y]=1-t[x][y];
}
int main(){
char in_map[6][6];
int i,j,k;
for(i=0;i<4;i++)scanf("%s",in_map[i]);
for(i=0;i<4;i++)for(j=0;j<4;j++)map[i+1][j+1]=Cg(in_map[i][j]);
int res=17,mem=-1;
for(k=0;k<search_size;k++){
for(i=1;i<=4;i++)for(j=1;j<=4;j++)t[i][j]=map[i][j];
int sum=0,tp=k;
int x=1,y=1;
for(i=1;i<=12;i++){
// if(!tp)break;
int temp=tp%2;tp/=2;
if(temp)change(x,y),sum++;
next(x,y);
}
for(i=1;i<=4;i++)if(t[3][i])change(4,i),sum++;
int flag=1;
for(i=1;flag&&i<=4;i++)for(j=1;flag&&j<=4;j++)if(t[i][j]){flag=0;break;}
if(flag){if(sum<res){res=sum;mem=k;}}
}
printf("%d\n",res);
for(i=1;i<=4;i++)for(j=1;j<=4;j++)t[i][j]=map[i][j];
int x=1,y=1;
for(i=1;i<=12;i++){
int temp=mem%2;mem/=2;
if(temp)change(x,y),printf("%d %d\n",x,y);
next(x,y);
}
for(i=1;i<=4;i++)if(t[3][i])change(4,i),printf("%d %d\n",4,i);
// return main();
return 0;
}
本文介绍了一道关于搜索剪枝的编程竞赛题目,并详细解释了如何通过优化搜索过程来减少不必要的计算,最终实现更高效的求解。文章提供了一个具体的代码示例,展示了如何通过限制搜索范围和适时应用剪枝策略来降低复杂度。
254

被折叠的 条评论
为什么被折叠?



