首页 > 其他分享 >P9723 [EC Final 2022] Chinese Checker

P9723 [EC Final 2022] Chinese Checker

时间:2023-11-14 22:13:15浏览次数:39  
标签:include Chinese int EC break Checker book && ib

原题链接

模拟赛出了,赛时被这个六芒星的形状吓住了,感觉被降智了,呜呜。

其实只要转化一下就可以愉快地爆搜了。

可以将这两条线看做坐标轴,然后把整个六芒星的的形状转化成横平竖直的样子,大概长这样(\(1\) 表示是棋盘):

0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0

于是就有了以下的初始化代码:

void init(){
	FOR(i,5,5) ib[1][i]=1;FOR(i,5,6) ib[2][i]=1;FOR(i,5,7) ib[3][i]=1;FOR(i,5,8) ib[4][i]=1;
	FOR(i,1,13) ib[5][i]=1;FOR(i,2,13) ib[6][i]=1;FOR(i,3,13) ib[7][i]=1;FOR(i,4,13) ib[8][i]=1;FOR(i,5,13) ib[9][i]=1;
	FOR(i,5,14) ib[10][i]=1;FOR(i,5,15) ib[11][i]=1;FOR(i,5,16) ib[12][i]=1;FOR(i,5,17) ib[13][i]=1;
	FOR(i,10,13) ib[14][i]=1;FOR(i,11,13) ib[15][i]=1;FOR(i,12,13) ib[16][i]=1;FOR(i,13,13) ib[17][i]=1;
}

极致的压行()

然后题目要求只能沿着对角线跳,而三条对角线分别被转化成了行、列和左上到右下的对角线。只需要枚举每个棋子,分别沿着三条对角线爆搜就好了,该剪枝就剪,根本跑不满,时间复杂度不是很会算,反正可以 AC()。

搜索的时候要注意一些细节,包括但不限于:

  • 沿着对角线搜到第一个棋子后就要返回,因为当前位置和跳过去的位置中间只允许存在一个棋子,就是那个跳板。

  • 中间走过的位置及时标记,不能重复走,可能会死循环。并且最终结果不同只与最终状态有关系,所以假如通过不同的方式能够到达同一个点,这个点只会对答案造成一次贡献。

  • 起点的棋子也要打上标记,不然有可能跳了一圈回来,从这个点跳走了,但这个棋子已经没了,不能跳。

  • 输入的时候也要注意,输入的是在棋盘上的位置,要转化成在整个矩阵里的位置。

其实以上是我踩过的坑,不过大概实现方法不同坑也不一样?所以说坑还得自己踩(逃)

代码仅供参考

点击查看代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<utility>
#include<vector>
#include<queue>
#include<bitset>
#include<map>
#define FOR(i,a,b) for(register int i=a;i<=b;++i)
#define ROF(i,a,b) for(register int i=a;i>=b;--i)
#define mp(a,b) make_pair(a,b)
#define pll pair<long long,long long>
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
using namespace std;
inline int read();
typedef long long ll;
typedef double db;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
int n,m,k;
int ib[20][20],base[20]={0,4,4,4,4,0,1,2,3,4,4,4,4,4,9,10,11,12};
int book[20][20],ans;
bitset<100>vis[100];
void dfs(int x,int y);
void init();
void solve();
int main()
{
	init();
	int T=read();
	while(T--) solve();
	return 0;
}


inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f*x;
}
void init(){
	FOR(i,5,5) ib[1][i]=1;FOR(i,5,6) ib[2][i]=1;FOR(i,5,7) ib[3][i]=1;FOR(i,5,8) ib[4][i]=1;
	FOR(i,1,13) ib[5][i]=1;FOR(i,2,13) ib[6][i]=1;FOR(i,3,13) ib[7][i]=1;FOR(i,4,13) ib[8][i]=1;FOR(i,5,13) ib[9][i]=1;
	FOR(i,5,14) ib[10][i]=1;FOR(i,5,15) ib[11][i]=1;FOR(i,5,16) ib[12][i]=1;FOR(i,5,17) ib[13][i]=1;
	FOR(i,10,13) ib[14][i]=1;FOR(i,11,13) ib[15][i]=1;FOR(i,12,13) ib[16][i]=1;FOR(i,13,13) ib[17][i]=1;
}
void solve(){
	queue<pii>q;
	memcpy(book,ib,sizeof ib);ans=0;n=read();
	FOR(i,1,n){
		int x=read(),y=read();
		y+=base[x];book[x][y]=2;
		q.push(mp(x,y));
	}
	FOR(i,0,20) vis[i].reset();
	while(!q.empty()){
		pii t=q.front();q.pop();
		vis[t.fi][t.se]=1;
		book[t.fi][t.se]=1;
		dfs(t.fi,t.se);
		vis[t.fi][t.se]=0;
		FOR(i,0,20) vis[i].reset();
		book[t.fi][t.se]=2;
	}
	printf("%d\n",ans);
}
void dfs(int x,int y){
	FOR(i,x+1,17){
		if(i+i-x>17) break;
		if(book[i][y]==2&&i+i-x<=17&&book[i+i-x][y]==1&&!vis[i+i-x][y]){
			int t=i+i-x;
			while(1){
				i++;if(i==t){vis[i][y]=1,dfs(i,y),ans++;break;}
				if(book[i][y]!=1) break;
			}
			break;
		}
		else if(book[i][y]!=1) break;
	}
	ROF(i,x-1,1){
		if(i+i-x<1) break;
		if(book[i][y]==2&&i+i-x>=1&&book[i+i-x][y]==1&&!vis[i+i-x][y]){
			int t=i+i-x;
			while(1){
				i--;if(i==t){vis[i][y]=1,dfs(i,y),ans++;break;}
				if(book[i][y]!=1) break;
			}
			break;
		}
		else if(book[i][y]!=1) break;
	}
	FOR(j,y+1,17){
		if(j+j-y>17) break;
		if(book[x][j]==2&&j+j-y<=17&&book[x][j+j-y]==1&&!vis[x][j+j-y]){
			int t=j+j-y;
			while(1){
				j++;if(j==t){vis[x][j]=1,dfs(x,j),ans++;break;}
				if(book[x][j]!=1) break;
			}
			break;
		}
		else if(book[x][j]!=1) break;
	}
	ROF(j,y-1,1){
		if(j+j-y<1) break;
		if(book[x][j]==2&&j+j-y>=1&&book[x][j+j-y]==1&&!vis[x][j+j-y]){
			int t=j+j-y;
			while(1){
				j--;if(j==t){vis[x][j]=1,dfs(x,j),ans++;break;}
				if(book[x][j]!=1) break;
			}
			break;
		}
		else if(book[x][j]!=1) break;
	}
	for(int i=x+1,j=y+1;i<=17&&j<=17;++i,++j){
		if(i+i-x>17||j+j-y>17) break;
		if(book[i][j]==2&&i+i-x<=17&&j+j-y<=17&&book[i+i-x][j+j-y]==1&&!vis[i+i-x][j+j-y]){
			int tx=i+i-x,ty=j+j-y;
			while(1){
				++i,++j;if(i==tx&&j==ty){vis[i][j]=1,dfs(i,j),ans++;break;}
				if(book[i][j]!=1) break;
			}
			break;
		}
		else if(book[i][j]!=1) break;
	}
	for(int i=x-1,j=y-1;i>=1&&j>=1;--i,--j){
		if(i+i-x<1||j+j-y<1) break;
		if(book[i][j]==2&&i+i-x>=1&&j+j-y>=1&&book[i+i-x][j+j-y]==1&&!vis[i+i-x][j+j-y]){
			int tx=i+i-x,ty=j+j-y;
			while(1){
				--i,--j;if(i==tx&&j==ty){vis[i][j]=1,dfs(i,j),ans++;break;}
				if(book[i][j]!=1) break;
			}
			break;
		}
		else if(book[i][j]!=1) break;
	}
}

标签:include,Chinese,int,EC,break,Checker,book,&&,ib
From: https://www.cnblogs.com/LHLeisus/p/17832710.html

相关文章

  • Hive_解析 get_json_object
    get_json_object(stringjson_string,stringpath)说明: 第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用.或[]读取对象或数组。如果输入的json字符串无效,那么返回NULL。 每次只能返回一个数据项。举例: data为test表中的字段,数据结构如下:......
  • CS224n笔记:word2vec(1)
    目录离散语义(discrete):分布语义(distribute):tokens、types分布的语言模型(distributionallanguagemodel):词嵌入模型Word2VecObjectivefunc(目标函数)Lossfunc(损失函数)P(O|C)和Softmax(x)P(O|C)的概率分布将损失函数展开求梯度公式损失函数的时间复杂度ChainRule:链......
  • Mysql中如何解决You can't specify target table '表名' for update in FROM clause报
    Mysql中如何解决Youcan'tspecifytargettable'表名'forupdateinFROMclause报错为什么会出现这个错误呢?这是因为在MySQL使用时,在同一条SQL语句中,不允许先SELECT出同一个表的某些值,再对该表进行UPDATE操作。解决方式#WriteyourMySQLquerystatementbelowdeletef......
  • 超时实现 select 计时器
     github.com\eclipse\[email protected]\token.go//WaitTimeoutimplementstheTokenWaitTimeoutmethod.func(b*baseToken)WaitTimeout(dtime.Duration)bool{  timer:=time.NewTimer(d)  select{  case<-b.complete:    if!tim......
  • electron安全
    俗话说的好,安全大于天,保证electron应用的安全也是一项重要的事情,本章节将安全分为以下5个方面:源码泄漏asar源码保护应用安全编码安全下面将会依次介绍上述内容。7.1源码泄漏目前electron在源码安全做的不好,官方只用asar做了一下很没用的源码保护,到底有多没用呢?你只需要下......
  • 正确配置 Spring Boot Security 跨域请求(CORS)
    如果SpringBoot项目引入SpringSecurity组件,单独声明CorsConfigurationSourceBean并不起作用,这是由于CORS预检请求不含SessionID而请求首先被SpringSecurity处理并拒绝导致的。因此,必须明确地配置SpringSecurity跨域参数以便正常处理跨域请求,下面是一个配置示例......
  • AT_abc230_f [ABC230F] Predilection 题解
    prelogue各位在比赛的时候一定要坚信自己的式子,然后去考虑自己的实现是不是挂了。本人在今天模拟赛的时候质疑自己的式子然后不看实现100->0。analysis考虑对这个给定数组进行前缀和,然后就将问题转化成为了求这个前缀和数组的子序列的个数。对于求子序列,我们很轻松可以写出......
  • 国标GB28181安防视频LiteCVR平台GIS电子地图模块开发介绍
    电子地图应用主要以GIS地理信息系统为核心,在联网监控工程视频监控业务管理中具有重要意义,能发挥GIS系统“一张图”可视化集成展示和空间决策分析方面的优势。视频监控平台LiteCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及......
  • 视频质量AI检测算法与LiteCVR视频质量诊断方案介绍
    LiteCVR视频质量诊断方案可以实现对监控设备常见的异常抖动、画面条纹、画面模糊、偏色、亮度异常、对比度异常、冻结、丢失、噪声等机器故障及恶意遮挡、恶意变化监控场景的行为做出准确判断,还可以对监控设备因为网络异常等原因导致的设备断线、取流异常、码率是否达标等问题进行......
  • Object.entries()
    Object.entries()方法返回一个给定对象自己的字符串键值对的数组。constobj={a:"aa",b:"bb",c:"cc"};console.log(Object.entries(obj),"Object.entries(obj)Object.entries(obj)");打印显示是这样[["a",......