c++棋盘游戏

给定一个十进制数0≤x<216,将它转换为二进制字符串并在高位填0以补足16位,就得到了一个长度为16的01字符串,我们用这个字符串表示4*4的棋盘,按从左到右,从上到下的顺序将0(白子)、1(黑子)放入棋盘

我们现在可以交换棋盘中相邻(共享一条边的两个格子相邻,因此一个格子至多有4个相邻的格子)的黑色和白色棋子。从左图的棋盘变为全部白子在上、全部黑子在下(右边棋盘所示)的棋盘,至少需要3步。

对于给定的棋盘(保证棋盘中恰好有8个白子和8个黑子),求把棋盘变为全部白子在上、全部黑子在下最少的交换步数。

输入格式

输入一行一个整数x,为十进制表示下的棋盘。

50%的测试数据满足棋盘可以在6次交换内变为白子在上、黑子在下。所有数据保证0≤x<216,且x转换为二进制后恰好有8个“1”。

输出格式

输出一行一个整数,最少需要交换的步数。

输入/输出例子1

输入:

447

输出:

3

输入/输出例子2

输入:

42405

输出:

8

样例解释

【样例说明1】参考上图,将(2,4)处的黑子移动到(3,3)需要3步

【样例说明2】如图所示,(42405)10=(1010 0101 1010 0101)

#include<bits/stdc++.h>
using namespace std;
int a[5][5];
int flag[65536];
int n;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct Node{
	int num;
	int step;
};
int to_num()
{
	int m=0;
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			m=m*2+a[i][j];
		}
	}
	return m;
}
void to_array(int n)
{
    for(int i=4;i>0;i--)
    {
        for(int j=4;j>0;j--)
        {
			a[i][j]=n%2;
			n/=2;
		}
    }
}
queue<Node>qu;
int BFS()
{
	Node p;
	p.num=255;
	p.step=0;
	if(n==255)
		return 0;
	qu.push(p);
	flag[255]=1;
	while(qu.size())
	{
		p=qu.front();
		qu.pop();
		int num=p.num;
		int s=p.step;
		to_array(num);
		for(int i=1;i<=4;i++)
		{
			for(int j=1;j<=4;j++)
			{
				for(int k=0;k<4;k++)
				{
					int nx=i+dx[k];
					int ny=j+dy[k];
					if(nx>=1 && nx<=4 && ny>=1 && ny<=4)
					{
						swap(a[i][j],a[nx][ny]);
						int mm=to_num();
						if(mm==n)
							return s+1;
						if(flag[mm]==0)
						{
							p.num=mm;
							p.step=s+1;
							qu.push(p);
							flag[mm]=1;
						}
						swap(a[i][j],a[nx][ny]);
					}
				}
			}
		}
	}
}
int main(){
    cin>>n;
    cout<<BFS();
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++棋牌游戏服务器架构通常包括以下几个主要组件: 1. 游戏逻辑层:负责处理游戏规则、游戏状态的更新和管理,以及处理玩家的操作请求。这一层通常由C++编写,包括游戏逻辑的实现和相关算法。 2. 网络通信层:负责处理客户端和服务器之间的网络通信。这一层通常使用TCP或UDP协议进行数据传输,并提供网络连接的建立、断开、数据收发等功能。常用的C++网络库有Boost.Asio、libevent等。 3. 数据库层:负责存储和管理游戏数据,如玩家信息、游戏记录等。这一层通常使用关系型数据库(如MySQL)或NoSQL数据库(如Redis)来存储数据,并提供相应的读写接口。 4. 多线程/多进程管理:为了提高服务器的并发处理能力,可以采用多线程或多进程的方式来处理客户端请求。多线程可以使用C++标准库中的std::thread或第三方库如pthread来实现,多进程可以使用fork或者第三方库如boost.process来实现。 5. 负载均衡与高可用性:为了提高服务器的性能和可用性,可以采用负载均衡技术将客户端请求分发到多台服务器上进行处理,同时可以使用集群和备份机制来实现高可用性。常用的负载均衡软件有Nginx、HAProxy等。 6. 安全认证与防作弊:为了保证游戏的公平性和安全性,可以在服务器端进行安全认证和防作弊处理。常见的技术包括数据加密、防止外挂和作弊程序的检测与防御等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子小院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值