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的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强.小强便打算 ...
随机推荐
- 【Lintcode】120.Word Ladder
题目: Given two words (start and end), and a dictionary, find the length of shortest transformation se ...
- 【Lintcode】105.Copy List with Random Pointer
题目: A linked list is given such that each node contains an additional random pointer which could poi ...
- BZOJ4408:[FJOI2016]神秘数
浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...
- bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...
- Python3解leetcode Single Number
问题描述: Given a non-empty array of integers, every element appears twice except for one. Find that sin ...
- jmp $
in intel x86 instruction set, "jmp $" means jump to this instruction location, thus fallin ...
- Windows下搭建Subversion 服务器
一.准备工作 1.获取 Subversion 服务器程序 到官方网站(http://subversion.tigris.org/)下载最新的服务器安装程序.目前最新的是1.5版本,具体下载地址在:ht ...
- 《Java多线程编程核心技术》读后感(六)
多线程的死锁 package Second; public class DealThread implements Runnable { public String username; public ...
- Coding-Job:从研发到生产的容器化融合实践
大家好,我是来自 CODING 的全栈开发工程师,我有幸在 CODING 参与了 Coding-Job 这个容器化的编排平台的研发.大家对 CODING 可能比较了解, Coding.net 是一个一 ...
- C# 移除string[] 数组中的指定元素
本文转载自 http://www.cnblogs.com/jcdd-4041/p/3279531.html 第一步:先把string[] 转换成 ArrayList 第二步:移除指定元素 第三步 ...