博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Luogu】P3930 SAC E#1 - 一道大水题 Knight
阅读量:6241 次
发布时间:2019-06-22

本文共 2601 字,大约阅读时间需要 8 分钟。

【题目】洛谷10月月赛R1 提高组

【题意】给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王。

【算法】状压+BFS

【题解】16种棋子中,马不能吃马,直接处理马和王,那么就剩13个棋子,可以压成2^13表示棋盘现有棋子存活状态。

然后对vis[2^13][n][n]进行bfs。

细节:

1.攻击直到碰到其它棋子,那个碰到的棋子也算攻击范围内。

2.判断碰到棋子时,注意该棋子是否在当前局面存活。

3.多组数据,Q中途退出要清空。

学到了:

1.一份长代码要细心经营,视若珍宝,动键盘之前要冷静把思路和框架理清楚,过程中步步为营,慢慢写总能写完的。

2.不要轻易相信自己的代码没有bug了,尽量对拍,把小数据的中间结果输出和手算比较正确性,从而改掉尽可能多的错误。

3.不要害怕写长的复杂的代码,先做框架,然后一步一步把子过程做好,一份超长代码就慢慢构造出来了。

4.枚举对角线的姿势!

#include
#include
#include
#include
#include
using namespace std;const int inf=0x3f3f3f3f,maxn=60;int n,mp[1<<14][maxn][maxn],map[maxn][maxn],p[maxn][maxn],ans;int cnt,tot,Tx,Ty,Sx,Sy;bool vis[1<<14][maxn][maxn];struct Node{
int x,y;}c[15],ch[15];struct cyc{
int S,x,y,st;};queue
Q;void qishi(int S,int x,int y){ mp[S][x-1][y+2]=mp[S][x+1][y+2]=mp[S][x+2][y-1]=mp[S][x+2][y+1]=1; if(x-2>0)mp[S][x-2][y-1]=mp[S][x-2][y+1]=1; if(y-2>0)mp[S][x-1][y-2]=mp[S][x+1][y-2]=1;}void king(int S,int x,int y){ mp[S][x-1][y-1]=mp[S][x-1][y]=mp[S][x-1][y+1]=1; mp[S][x][y-1]=mp[S][x][y+1]=1; mp[S][x+1][y-1]=mp[S][x+1][y]=mp[S][x+1][y+1]=1;}bool m(int S,int x,int y){ if(map[x][y]<=1)return 1; if(map[x][y]==2||map[x][y]==7)return 0; if(S&(1<<(p[x][y]-1)))return 0; return 1;}void chengbao(int S,int x,int y){ for(int i=x-1;i>=1;i--)if(m(S,i,y))mp[S][i][y]=1;else{mp[S][i][y]=1;break;} for(int i=x+1;i<=n;i++)if(m(S,i,y))mp[S][i][y]=1;else{mp[S][i][y]=1;break;} for(int i=y-1;i>=1;i--)if(m(S,x,i))mp[S][x][i]=1;else{mp[S][x][i]=1;break;} for(int i=y+1;i<=n;i++)if(m(S,x,i))mp[S][x][i]=1;else{mp[S][x][i]=1;break;}}void zhujiao(int S,int x,int y){ for(int i=1;i
n||y<1||y>n||mp[S][x][y]||vis[S][x][y])return; vis[S][x][y]=1; if(map[x][y]==2)ans=st; if(map[x][y]>=3&&map[x][y]<=6)if(S&(1<<(p[x][y]-1)))S^=(1<<(p[x][y]-1)); vis[S][x][y]=1; Q.push((cyc){S,x,y,st});}char s[maxn];int main(){while(scanf("%d",&n)==1){ cnt=tot=0; memset(map,0,sizeof(map));memset(p,0,sizeof(p));memset(mp,0,sizeof(mp));memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=n;j++){ if(s[j]=='K')map[i][j]=7,c[++cnt].x=i,c[cnt].y=j; if(s[j]=='X')map[i][j]=2,Tx=i,Ty=j,c[++cnt].x=i,c[cnt].y=j; if(s[j]=='O')Sx=i,Sy=j; if(s[j]=='C')map[i][j]=3,ch[tot].x=i,ch[tot].y=j,p[i][j]=tot++; if(s[j]=='B')map[i][j]=4,ch[tot].x=i,ch[tot].y=j,p[i][j]=tot++; if(s[j]=='Q')map[i][j]=5,ch[tot].x=i,ch[tot].y=j,p[i][j]=tot++; if(s[j]=='P')map[i][j]=6,ch[tot].x=i,ch[tot].y=j,p[i][j]=tot++; } } for(int S=0;S<(1<
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7638041.html

你可能感兴趣的文章
加速scp传输速度
查看>>
Kali Linux 安全渗透教程&lt;第三更&gt;1.2 安全渗透所需工具
查看>>
ios 使用Safari浏览器跳转打开、唤醒app
查看>>
HDU 1520 Anniversary party(DFS或树形DP)
查看>>
Linux 安装Nginx具体图解教程
查看>>
Suricata的所有运行方式模式(图文详解)
查看>>
1355: [Baltic2009]Radio Transmission
查看>>
kaldi的TIMIT实例三
查看>>
Prolog 逻辑推导语言
查看>>
又搬回来了233
查看>>
CentOS7下单机部署RabbltMQ环境的操作记录
查看>>
C# 编码命名规则
查看>>
centos7执行 wget命令: command not found的两种解决方法
查看>>
Win8Metro(C#)数字图像处理--2.25二值图像距离变换
查看>>
包管理和环境管理软件Anaconda
查看>>
使用curator 来管理elasticsearch的index
查看>>
manjaro折腾手记
查看>>
vue - webpack.dev.conf.js for merge
查看>>
Jvm(16),jvm创建对象---对象在内存中的创建
查看>>
Microsoft SQL Server 2005 Service fails to start
查看>>