BZOJ 1085 / LOJ 2151 [SCOI2005]骑士精神 (剪枝/A*迭代搜索)
2024-10-01 13:39:19
题目大意:略
直接爆搜会T,我们优化一下,统计出当前棋盘和目标棋盘不同的位置的数量k,那么当前棋盘变成目标棋盘最少的移动次数是k-1
每次选择一个最大深度ma,那么如果当前走了dep步,显然必须保证dep+k-1<=ma,否则当前棋盘就是永远无法在规定步数ma内到达目标棋盘的
其实这个不算很A*吧...应该算剪枝
移动方向的数量打错了WA了好久...另外LOJ上有这道题的数据
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NN 65538
#define MM 100
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define inf 0x3f3f3f3f
#define idx(X,Y) ((X)*5+(Y))
using namespace std; int T;
const int Ed=;
const int maxn=;
int mp[][],bin[],cnt[NN];
int xx[]={-,-,,,,,-,-};
int yy[]={,,,,-,-,-,-};
int check(int x,int y)
{if(x<||y<||x>||y>)return ;return ;}
int dfs(int dep,int s,int p,int ma,int fa,int fp)
{
if(s==Ed&&p==) return ;
if(dep>=ma) return ;
int x=p/,y=p%;
int tx,ty,t,tp,sum,h,ans;
sum=Ed^s;
h=cnt[sum&maxn]+cnt[sum>>];
if((p!=)&&(!(sum&(<<p)))&&(!(Ed&(<<p)))) h++;
if((p!=)&&(!(sum&(<<)))&&(!(s&(<<)))) h++;
if(dep+h->ma) return ;
for(int k=;k<;k++)
{
tx=x+xx[k],ty=y+yy[k];
if(!check(tx,ty)) continue;
if(s&(bin[idx(tx,ty)]))
t=(s^bin[idx(tx,ty)])|bin[idx(x,y)];
else t=s;
tp=idx(tx,ty);
if(t==fa&&tp==fp) continue;
ans=dfs(dep+,t,tp,ma,s,p);
if(ans) return ;
}return ;
} int main()
{
//freopen("t2.in","r",stdin);
scanf("%d",&T);
bin[]=;
for(int i=;i<=;i++)
bin[i]=bin[i-]<<;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(i&(<<j)) cnt[i]++;
while(T--)
{
char str[];int s=,p;
for(int i=;i<;i++)
{
scanf("%s",str);
for(int j=;j<;j++){
if(str[j]=='*'){
p=idx(i,j);
}else if(str[j]==''){
s|=(bin[idx(i,j)]);
}
}
}
int fl=;
for(int k=;k<=;k++){
int ans=dfs(,s,p,k,-,);
if(ans){
printf("%d\n",k);
fl=;break;}
}
if(!fl) printf("-1\n");
}
return ;
}
最新文章
- .net 导出Excel功能
- FlashBuilder 新建项目时提示 java.lang.nullpointerexception
- ENVI数据显示操作【Tools菜单操作1】
- 内嵌DB
- 关于Java异常和错误的几个问题
- Javascript call与apply记录
- Android判断界面
- 远程连接MySQL 不允许
- Oracle行转列实例
- ThinkPHP 初探
- Vue(二十五)打包后路径报错问题
- 新版的 Springsecurity request.getRequestDispatcher).forward(request, response); 404 问题,已解决
- 【转载】关闭XenServer中挂起(hang)虚机的方法
- LigerUI子父窗口之间传参问题
- struts2实现jQuery的异步交互
- linux 下安装nginx
- Spring WebSocket踩坑指南
- swift 添加webview
- jquery获取浏览器宽高
- PHP获取访客IP、地区位置信息、浏览器、来源页面