XMU2018摸底测试 五子棋

本文介绍了一种算法,用于计算在特定位置放下棋子后五子棋盘上五子连珠的数量变化,包括增加或减少的具体数目。通过模拟不同方向上的连续黑子数量来确定变化情况。

五子棋

Description

嘿嘿嘿同学很喜欢下五子棋。有一天,他在网络上发现了一个N \times MN×M 的棋盘,这个棋盘有N行,M列,棋盘上只有黑子和空格。嘿嘿嘿同学想要知道,在其中一个空格上放置上一个黑子,会使得五子连珠的个数发生怎样的变化

我们所认为的五子连珠为横竖和两个斜对角线共4个方向,并且若多余五子成一条线,也只视为一个五子连珠。
有交叉的五子连珠互不影响计算。

例如:
下面这种情况在X处填入黑子后视为增加一个五子连珠:

     
     
  X   
     
     
     

在X处填入黑子后视为增加两个五子连珠:

     
     
X
     
     
     

在X处填入黑子后视为减少两个五子连珠:

          
          
          
          
          
X
          
          
          
          
          

Format

Input

输入的第一行为两个正整数N,M (0 < N,M <= 100)
接下来N行,每行M个数字,0或1,0表示空格,1表示黑子
在接下来1行两个正整数x,y(0 < x <= N, 0 < y <= M),表示询问若在(x,y)处放上黑子,五子连珠的个数会发生怎样的变化。题目保证输入的位置为空格。

Output

输出一个整数,表示若在(x,y)处放上黑子后,整个棋盘上五子连珠的变化情况,正数表示增加,负数表示减少,0表示不变

Sample 1

Input

5 5
1 0 1 0 0
0 0 0 0 0 
0 1 1 0 0
0 1 1 1 0 
0 1 1 0 1
2 2

Output

1

Sample 2

Input

5 5
1 0 1 0 0
1 1 0 1 1 
0 1 1 0 0
0 1 1 1 0 
0 1 1 0 1
2 3

Output

2

Limitation

1s, 1024KiB for each test case.

Hint

Source

Vijos Original






题目链接:

    https://www.vijos.org/d/XMU_ACM/p/5a9a0642d3d8a1371223e280

题目大意

    对于给定的五子棋棋盘,再下一枚棋子之后,五子连珠数量的变化情况
题目思路

    【模拟】

    解答该题的重点在于,如何判断5子连珠的变化,下面提供一种可行的方

法:
    对于题目给定的空白的格子X(未落子)
    在这个格子相邻的8个方向中,寻找每个方向上的未落子前的连续黑子个数
    这样得到了X八个方向上原先的黑子数目,接着分情况讨论
    考虑在一条直线上的两个方向(上和下、左和右,左上和右下、左下和右上)
    分别有三种情况:
    1.下完黑子后五子连珠个数从0变成1
    2.下完黑子后五子连珠个数保持1或0不变
    3.下完黑子后五子连珠个数由2变为1
    四个方向分开考虑,即可得到最终的答案


#define _CRT_SECURE_NO_WARNINGS
/****************************************************

Author : Coolxxx
Copyright 2018 by Coolxxx. All rights reserved.
BLOG : http://blog.youkuaiyun.com/u010568270

****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
#define N 104
const double EPS = 1e-8;
const int J = 10;
const int MOD = 1000000007;
const int MAX = 0x7f7f7f7f;
const int inf = 100;
using namespace std;
int n, m, lll, ans, cas;
int ma[N][N];
int l[N][N][8];
int dx[]={-1,-1,-1,0,1,1,1,0};
int dy[]={-1,0,1,1,1,0,-1,-1};
int main()
{
#ifndef ONLINE_JUDGE
	//freopen("1.txt", "r", stdin);
	//freopen("2.txt", "w", stdout);
#endif
	int i, j, k;
	int x, y, z;
	while (~scanf("%d%d", &n, &m) && n && m)
	{
		cas=1;
		mem(ma,0);
		mem(l,0);
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				scanf("%d",&ma[i][j]);
			}
		}
		for(k=0;k<8;k++)
		{
			for(i=1;i<=n;i++)
			{
				for(j=1;j<=m;j++)
				{
					if(ma[i][j])continue;
					x=i+dx[k],y=j+dy[k];
					while(x>0 && x<=n && y>0 && y<=m && ma[x][y])
						l[i][j][k]++,x=x+dx[k],y=y+dy[k];
				}
			}
		}
		while(cas--)
		{
			scanf("%d%d",&x,&y);
			ans=0;
			for(k=0;k<4;k++)
			{
				if(l[x][y][k]+l[x][y][k+4]>=4 && l[x][y][k]<5 && l[x][y][k+4]<5)ans++;
				if(l[x][y][k]>=5 && l[x][y][k+4]>=5)ans--;
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}
/*
//

//
*/

### 关于XMU OOMALL的理解 XMU OOMALL 可能是指厦门大学(Xiamen University, XMU)的一个在线订单管理系统(Order Management System, OOMALL)。如果将其与引用中的 SpringBoot 和 Java 学生学费支付系统的描述相结合,则可以推测这是一个基于 Web 的应用程序,用于管理学生的学费支付流程以及其他相关功能。 从技术角度来看,Spring Boot 是一种流行的框架,它简化了构建独立的、生产级的 Spring 应用程序的过程。Java 则是一种广泛使用的编程语言,适用于开发企业级应用。结合这些工具和技术栈,可以实现一个高效且可扩展的学生学费支付系统[^1]。 以下是关于如何设计这样一个系统的一些核心概念: #### 1. 用户角色定义 在该系统中存在三种主要用户角色:学生、财务人员以及管理员。每种角色都有特定权限和职责: - **学生**负责完成个人信息注册并执行缴费操作。 - **财务人员**能够查看所有交易记录,并处理异常情况。 - **管理员**则具有最高权限,可用于维护整个平台的安全性和稳定性。 #### 2. 数据库交互机制 每当有新的登录尝试发生时,系统会向数据库入一条日志记录以跟踪活动状态。这种做法有助于审计目的以及提高安全性水平。 #### 3. 注册模块的重要性 考虑到高校环境中可能存在频繁的人事变动,因此提供灵活便捷的新账户创建途径显得尤为重要。通过允许每位新生自行完成账号设置过程,不仅减少了人工干预需求,还提升了用户体验满意度。 ```java // 示例代码片段展示简单的身份验证逻辑 public boolean authenticateUser(String username, String password){ // 假设这里有一个方法可以从数据库获取密码哈希值 String storedPasswordHash = getUserPasswordFromDatabase(username); if(storedPasswordHash != null && PasswordUtil.matches(password, storedPasswordHash)){ logLoginAttempt(username, true); // 成功登录的日志记录 return true; }else{ logLoginAttempt(username, false); // 失败登录的日志记录 return false; } } ``` 上述代码展示了基本的身份验证函数结构,其中包含了成功或失败情况下均需调用的方法来保存相应的事件数据到后台存储位置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值