2019 深信服 下棋(DFS+回溯)
链接:https://www.nowcoder.com/questionTerminal/a0feb0696e2043a5b3b0779fa861b64a?f=discussion
来源:牛客网
下法规则:
1.每次落子后,以该棋子为中心的8个方向(米字形的8条直线),如果有同色棋子,
且两个同色棋子之间连续排列着若干个异色棋子,无空白及同色棋子。则,这次落子可以把这些夹在中间的异色棋子全部翻色(即黑变白,白变黑)。
2. 黑白子交错落子。
3. 如果一个位置上有棋子,不能继续在该位置上落子;
4. 如果一个位置上落子后,不能翻对手的棋子,则该位置不能落子;
1表示黑色,2表示白色,0表示空白未落子
白棋落子后,棋盘变化情况如下所示:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 => 0 0 0 1 2 0 0 0
0 0 0 2 1 0 0 0 0 0 0 2 2 2 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 => 0 0 0 1 2 0 0 0
0 0 1 2 1 2 0 0 0 0 1 2 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
输入描述:
第一行为白子需要走的步数 接下来8行数据,指明棋盘上的棋子状态,其中1为黑子,2为白子,0为空位置
输出描述:
白子下完N手后,棋盘上的白子个数的最大可能。
输入
1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0
0 0 0 2 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
输出
4
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#define ll long long
using namespace std;
typedef pair<int,int> p; int mp[][];
int dir[][]={-,,,,,-,,,-,-,-,,,-,,};//上,下,左,右,左上,右上,左下,右下
int n,ans; int find_sum(int x,int y,int dx,int dy,int nwcolor,int others)
{
int cnt=;
x+=dx; y+=dy;
while(x>=&&x<&&y>=&&y<)
{
if(mp[x][y]==nwcolor)
return cnt;
if(mp[x][y]!=others)
return ;
x+=dx;
y+=dy;
cnt++;
}
return ;
}
void dfs(int step)
{
if(step==n)
{
int cnt=;
for(int i=; i<; i++)
{
for(int j=; j<; j++)
if(mp[i][j]==) cnt++;
}
ans=max(ans,cnt);
return;
}
int nw,lst;
vector<p> g;//保存要改变的棋子位置
if(step%==)
{
nw=;
lst=;
}
else
{
nw=;
lst=;
}
for(int i=; i<; i++)
{
for(int j=; j<; j++)
{
if(mp[i][j]==)
{
int flag=;//回溯标记
for(int k=; k<; k++)
{
int cnt=find_sum(i,j,dir[k][],dir[k][],nw,lst);//从当前位置[i,j]沿当前方向可以改变多少个棋子
if(cnt>)
{
int x=i,y=j;
for(int ii=; ii<cnt; ii++)
{
mp[x][y]=nw;
g.push_back(make_pair(x,y));//保存要更新的棋子位置
x+=dir[k][];
y+=dir[k][];
}
flag=;
}
}
if(flag)
{
dfs(step+);
for(int ii=; ii<g.size(); ii++)//回溯
{
mp[g[ii].first][g[ii].second]=lst;
}
mp[i][j]=;
g.clear();
}
}
}
}
} int main()
{
scanf("%d",&n);
n=*n-;
for(int i=; i<; i++)
{
for(int j=; j<; j++)
{
scanf("%d",&mp[i][j]);
}
}
ans=;
dfs();
printf("%d\n",ans);
return ;
}
2019 深信服 下棋(DFS+回溯)的更多相关文章
- 【面试总结】2019校招京东一面二面,及深信服技术面(已拿深信服offer),还有百度一面
百度一面: 1.自我介绍+项目介绍 2.进程和线程的区别 3.常用linux命令列举 4.堆排序 5.快速排序 反问环节. 现在的状态是岗位转推,毕竟百度投的是开发岗. 京东一面: 1.C++三大特性 ...
- 蓝桥杯 算法提高 8皇后·改 -- DFS 回溯
算法提高 8皇后·改 时间限制:1.0s 内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8 ...
- 素数环(dfs+回溯)
题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...
- NOJ 1074 Hey Judge(DFS回溯)
Problem 1074: Hey Judge Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: ...
- HDU 1016 Prime Ring Problem(经典DFS+回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU1016 Prime Ring Problem(DFS回溯)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- uva 193 Graph Coloring(图染色 dfs回溯)
Description You are to write a program that tries to find an optimal coloring for a given graph. Col ...
- 深信服模式(先做减法,必须拜访客户三次、研究需求方向,把产品的问题控制住,快速反应,在未来十年,绝大部分业务都会搬到Internet上来,实现All on Internet)good
深圳市盛凯信息科技有限公司与深信服合作多年,可以说是看着深信服“飞速”长大的.盛凯的总经理邓渊在采访中笑言:“他们(深信服)发展得太快,而我们发展得太慢.” 深信服的产品线已从最初只有VPN一条,到目 ...
随机推荐
- [洛谷P4463] calc (生成函数)
首先注意到题目中 \(a\) 数组是有序的,那我们只用算有序的方案乘上 \(n!\) 即可. 而此时的答案显然 \[Ans=[x^n](1+x)(1+2x)\dots (1+Ax)=\prod_{i= ...
- 使用Docker搭建Spark集群(用于实现网站流量实时分析模块)
上一篇使用Docker搭建了Hadoop的完全分布式:使用Docker搭建Hadoop集群(伪分布式与完全分布式),本次记录搭建spark集群,使用两者同时来实现之前一直未完成的项目:网站日志流量分析 ...
- vtk学习记录(一)——vtk工程配置与生成
前言 图形图像这块儿,最近因为工作需要接触的相对多了点儿,精力基本上也都投入了这块儿,搞的天天要死要活,毕竟我一个.net的突然来到cxx的世界,也是很苦恼的,也是头一次见到新建工程就需要配置并且解决 ...
- stm32控制步进电机加减速
实习公司项目需要控制步进电机,电机方面主要包括控制运动.加减速.限位.下面介绍一下在电机控制方面的心得,由于对于电机的控制不需要很精确,并且自身能力有限,相比于大牛有很大的差距. 1.需要实现的功能 ...
- 新建maven工程运行出现Intellij idea 报错:Error : java 不支持发行版本5
Step1点击: 点击 保持一致: Step2点击 这样就可以了. 主要是运行时jdk版本不一致的问题
- 1-1_微信小程序Buddy群记账背景
1-1_微信小程序需求背景及评审 背景: 我是一个做了2年的Java后台开发 ,最近换了份工作 改做全栈了,需要对各方面的知识都有一定程度的认识及掌握, 虽然现如今还未要求开发小程序,但是已经有趋势了 ...
- CCF认证 2019-12-3
分析 后面的数据,坐标分布太离散,不能用一个二位数组来模拟垃圾分布.因此,考虑用一个数组记录每个垃圾点的位置. 先根据x坐标.再根据y坐标进行排序. 再遍历数组中的每一处垃圾点,判断其是否能建回收站( ...
- mysql修改字符集为utf8
https://zhidao.baidu.com/question/1642165712897935220.html
- Nexus-vPC基础实验
一.实验拓扑: 由于条件有限,使用两个N5K做基本的vPC实验,Peer Keepalive Link使用的是两个Nexus 5K的Mgm0接口. 二.配置步骤:1.先构建vPC domain,并在d ...
- 【转】获取Jenkins构建时Git Change Log
原文:https://www.jianshu.com/p/513ab6915dbd 在基于Jenkins进行CI持续集成的工作,在构建后上传蒲公英时想将本次版本的git commit信息同步到蒲公英的 ...