P3930 SAC E#1 - 一道大水题 Knight
TLE,额 ,有空再写吧。
#include<queue>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={,,-,-,,,-,-},dy[]={,-,,-,,-,,-};
const int N = ;
struct node{
int x,y;
int step,state;
};
queue<node>q;
int n,sx,sy;
char a[N][N];
int id[N][N],tot;
bool Vis[N][N][];
bool check( int state,int x ,int y)
{
if(Vis[x][y][state])
return ;
//下
for(int i=x+;i<=n;i++)
if(a[i][y]!='.'&& !(state&(<<id[x][y])))
{
if(a[i][y]=='C'||a[i][y]=='Q')
return ;
break;
}
//上
for(int i=x-;i<=;i--)
if(a[i][y]!='.'&& !(state&(<<id[i][y])))
{
if(a[i][y]=='C'||a[i][y]=='Q')
return ;
break;
}
//左
for(int j=y+;j<=n;j++)
if(a[x][j]!='.'&&!(state&(<<id[x][j])))
{
if(a[x][j]=='C'||a[x][j]=='Q')
return ;
break;
}
//右
for(int j=y-;j>=;j--)
if(a[x][j]!='.'&&!(state&(<<id[x][j])))
{
if(a[x][j]=='C'||a[x][j]=='Q')
return ;
break;
}
//左上
for(int i=x-,j=y-;i>=&&j>=;i--,j--)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
//右上
for(int i=x+,j=y-;i<=n&&j>=;i++,j--)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
//左下
for(int i=x-,j=y+;i>=&&j<=n;i--,j++)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
//右下
for(int i=x+,j=y+;i<=n&&j<=n;i++,j++)
if(a[i][j]!='.'&&!(state&(<<id[i][j])))
{
if(a[i][j]=='B'||a[i][j]=='Q')
return ;
break;
}
int X,Y;
for(int i=;i<=;i++)
{
X=x+dx[i];Y=y+dy[i];
if(X>=&&X<=n&&Y>=&&Y<=n&&a[X][Y]=='K')
return ;
}
if(x!=&&((y!=n&&a[x-][y+]=='P'&&!(state&(<<(id[x-][y+]))||(y!=&&a[x-][y-]=='P'&&!(state&(<<id[x-][y-])))))))
return ;
for(int i=x-;i<=x+;i++)
for(int j=y-;j<=y+;j++)
if(x>=&&x<=n&&y>=&&y<=n)
{
if(a[i][j]=='X') return ;
}
return ;
}
void work()
{
queue<node>q;tot=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
id[i][j]=-,a[i][j]=;
for(int k=;k<=(<<);k++)
Vis[i][j][k]=;
} for(int i=;i<=n;i++)
{
scanf("%s",a[i]+);
for(int j=;j<=n;j++)
{
if(a[i][j]=='O')
sx=i,sy=j,a[i][j]='.';
else
if(a[i][j]=='C'||a[i][j]=='K'||a[i][j]=='Q'||a[i][j]=='X'||a[i][j]=='P')
id[i][j]=tot++;
else a[i][j]='.';
}
}
if(!check(,sx,sy))
{
cout<<-;
return;
}
q.push((node){sx,sy,,});
node now;int x,y,state;
while(!q.empty())
{
now=q.front();q.pop();
state=now.state;
for(int i=;i<;i++)
{
x=now.x+dx[i];y=now.y+dy[i];
if(x<||x>n||y<||y>n) continue;
if(a[x][y]=='X')
{
printf("%d\n",now.step+);
return;
}
if(a[x][y]!='.')
state|= <<id[x][y];
if(check(state,x,y))
Vis[x][y][state]=,q.push((node){x,y,now.step+,state});
}
}
cout<<-;
}
int main()
{
while(scanf("%d",&n))
work();
return ;
}
P3930 SAC E#1 - 一道大水题 Knight的更多相关文章
- 【Luogu】P3930 SAC E#1 - 一道大水题 Knight
[题目]洛谷10月月赛R1 提高组 [题意]给定n*n棋盘和<=16个棋子,给几个棋子种类和攻击范围,现我方只有一马,求能否吃王. [算法]状压+BFS [题解]16种棋子中,马不能吃马,直接处 ...
- [洛谷3930]SAC E#1 - 一道大水题 Knight
Description 他们经常在一起玩一个游戏,不,不是星际争霸,是国际象棋.毒奶色觉得F91是一只鸡.他在一个n×n的棋盘上用黑色的城堡(车).骑士(马).主教(象).皇后(副).国王(帅).士兵 ...
- 第三届山西省赛1004 一道大水题(scanf)
一道大水题 时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535KB 通过次数: 44 总提交次数: 1020 问题描述 Dr. Pan作为上兰帝国ACM的总负责人, ...
- 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题
在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
点击打开链接 2226: Contest Print Server Time Limit: 1 Sec Memory Limit: 128 MB Submit: 53 Solved: 18 [Su ...
- SAC E#1 - 一道神题 Sequence1
题目背景 小强和阿米巴是好朋友. 题目描述 小强很喜欢数列.有一天,他心血来潮,写下了一个数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种:波动数列. 一个长度为n的波动数列满足对于任何i(1 < ...
- SAC E#1 - 一道中档题 Factorial
题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服 ...
- 【洛谷十月月测】 P3927 SAC E#1 - 一道中档题 Factorial
题目传送门:https://www.luogu.org/problemnew/show/P3927 题目大意:给你两个正整数n,k,求n!在k进制下末尾零的数量. 我们通过简单的数学分析,便可以发现, ...
- P3928 SAC E#1 - 一道简单题 Sequence2
题目背景 小强和阿米巴是好朋友. 题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强.小强便打算 ...
随机推荐
- <C++>友元与虚函数的组合
为类重载<<与>>这两个运算符时,重载函数必须为该类的友元函数. 当友元不能被继承,故不能当作虚函数,无法使用多态. 可以用以下结构实现友元与虚函数的组合. class bas ...
- BZOJ1878:[SDOI2009]HH的项链
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- 创建自己的YUM仓库
1. 首先,假定我们应用的名字叫helloworld(可以参考简单 RPM 包制作来创建两个版本helloworld安装RPM包,helloworld-1.0.0-1.el6.x86_64.rpm和h ...
- C# 线程的暂停和恢复的 实现
我们可以通过ManualResetEvent类来实现. 声明, 初始化时不执行 private static ManualResetEvent _eventWorkList = new ManualR ...
- MySQL锁之一:锁详解
一. 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进 ...
- .NET 下的 POP3 编程代码共享
前一段时间在论坛上看见有人问如何使用.net进行POP3编程,其实POP3的使用很简单,所以.net没有向SMTP那样给出相应的类来控制. 废话少说,程序员最需要的使代码. 1.打开VS.NET 20 ...
- linux下libphenom的测试代码
使用说明:测试使用libphenom库的字符串追加函数,效率是strcat的60多倍.所以在进行大量的字符串累加的时候可以考虑使用libphenom库 依赖库: ck-.tar.gz cmake-. ...
- tcpkill工作原理分析
此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 日常工作生活中大家在维护自己的服务器.VPS有时会碰到这样的情况:服务器上突然出现了许多来自未知ip的网络连 ...
- 在 WinForm/WPF 下制作 Google Material Design 风格程序
国内社区没有,顺手转.WinForm: https://github.com/IgnaceMaes/MaterialSkin演示:https://www.youtube.com/watch?v=A8o ...
- Elasticsearch Query DSL查询入门
本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...