【Codeforces Global Round 12】 C2 - Errich-Tac-Toe题解(思维)
题目要求不能有有三个连续相同的'X'或'O',注意到这样的连续串它们的横纵坐标之和是连续变化的,考虑将它们按照横纵坐标之和对 \(3\)的模值分组,因为这样分组后相邻的三个相同字符就被分到了三个不同的组中,这样可以通过将其中一个组的字符所在位置全部变为其他字符,这样就保证没有三个连续相同字符了,那么我们分别从'X'和'O'中选出一组转化为其他字符就可以保证满足没有三个连续相同字符了。但是考虑这样的情况: \(\begin{matrix}.X. \\ OOO \\ .X.\end{matrix}\),假定中间那个'O'的横纵坐标和对 \(3\)的模值是 \(2\),这时如果'O'选的组和'X'选的组都都是模值为 \(2\)的,那么最终就会变成这样:\(\begin{matrix}.X. \\ OXO \\ .X.\end{matrix}\),明显不满足,原因在于虽然没有连续三个'O'了,但却造成了连续三个'X',而且由于这是后天造成的,之前的分组对这个新形成的'X'不起作用,导致前面的做法假了。为了避免这种情况,我们只需从'X'和 'O'中选出模数不同的两组即可。证明:假定从'X'中选出了横纵坐标和模 \(3\)为 \(1\)的组,从'O'中选出了模为 \(2\)的组,这样新产生的'X'或'O'都不会再形成新的 \(3\)连续相同字符序列。举个例子,坐标为 \((2,2)\)的'X'变成了'O',它的坐标和对 \(3\)取模是 \(1\),也就是从 'X'选的组的模值是 \(1\),那么从'O'中选的组的模值要么是 \(0\)要么是 \(2\),而一个 \(3\)连续序列必然同时包含模值为 \(0,1,2\)的点,现在缺失了 \(0\)或 \(2\)故不可能产生新的连续序列。证毕。然后为了满足题目操作限制的要求,我们需要选择两个组满足这两个组包含的点数最少。
#include<cstdio>
#include<cstring>
int T, n;
int X[5], O[5];
char s[305][305];
int main(){
scanf("%d", &T);
while(T--){
scanf("%d", &n);
memset(X, 0, sizeof(X));
memset(O, 0, sizeof(O));
for(int i = 1; i <= n; ++i) scanf("%s", s[i] + 1);
for(int i = 1; i <= n; ++i)
for(int t = 1; t <= n; ++t){
if(s[i][t] == 'X') ++X[(i + t) % 3];
if(s[i][t] == 'O') ++O[(i + t) % 3];
}
int minn = 1e9, j, k;
for(int i = 0; i < 3; ++i)
for(int t = 0; t < 3; ++t)
if(i != t && X[i] + O[t] < minn){
minn = X[i] + O[t];
j = i, k = t;
}
for(int i = 1; i <= n; ++i)
for(int t = 1; t <= n; ++t){
if(s[i][t] == 'X' && (i + t) % 3 == j) s[i][t] = 'O';
if(s[i][t] == 'O' && (i + t) % 3 == k) s[i][t] = 'X';
}
for(int i = 1; i <= n; ++i) puts(s[i] + 1);
}
return 0;
}
【Codeforces Global Round 12】 C2 - Errich-Tac-Toe题解(思维)的更多相关文章
- Codeforces Global Round 12 D. Rating Compression (思维,双指针)
题意:给你一长度为\(n\)的数组,有一长度为\(k\ (1\le k \le n)\)的区间不断从左往右扫过这个数组,总共扫\(n\)次,每次扫的区间长度\(k=i\),在扫的过程中,每次取当前区间 ...
- C. Meaningless Operations Codeforces Global Round 1 异或与运算,思维题
C. Meaningless Operations time limit per test 1 second memory limit per test 256 megabytes input sta ...
- Codeforces Global Round 2 E. Pavel and Triangles(思维+DP)
题目链接:https://codeforces.com/contest/1119/problem/E 题意:有n种长度的棍子,有a_i根2^i长度的棍子,问最多可以组成多少个三角形 题解:dp[i]表 ...
- CodeForces Global Round 1
CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...
- Codeforces Global Round 1 - D. Jongmah(动态规划)
Problem Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...
- Codeforces Beta Round #12 (Div 2 Only)
Codeforces Beta Round #12 (Div 2 Only) http://codeforces.com/contest/12 A 水题 #include<bits/stdc++ ...
- Codeforces Global Round 2 题解
Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...
- Codeforces Global Round 1 (A-E题解)
Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...
- Codeforces Global Round 3
Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...
- Codeforces Global Round 1 (CF1110) (未完结,只有 A-F)
Codeforces Global Round 1 (CF1110) 继续补题.因为看见同学打了这场,而且涨分还不错,所以觉得这套题目可能会比较有意思. 因为下午要开学了,所以恐怕暂时不能把这套题目补 ...
随机推荐
- [gin]简单的gin-mongo
前言 基于Gin框架编写的Web API,实现简单的CRUD功能,数据存放在MongoDB,并设置Redis缓存. 代码需要简单的分模块组织. go mod init buildginapp 代码参考 ...
- 《Kali渗透基础》14. 无线渗透(四)
@ 目录 1:相关工具 1.1:Aircrack-ng 1.1.1:airmon-ng 1.1.2:airodump-ng 1.1.3:aireplay-ng 1.1.4:airolib-ng 1.1 ...
- C++的编译链接与在vs中build提速
通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件.在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000) ...
- API接口开发管理平台--多领域企业数字化管理解决方案
随着数字化时代的到来,企业需要进行数字化转型才能更好地适应市场需求和用户需求.而API接口则是数字化转型中的重要组成部分,可以帮助企业更好地管理信息,提高效率.本文将介绍挖数据解决方案--API接口开 ...
- IOS苹果应用IPA一键签名工具(苹果重签名,企业签名,Windows平台,时间控制)
苹果应用IPA一键签名工具可以在windows平台对苹果应用IPA文件重新签名,无需MAC苹果电脑和配置XCODE开发环境,便可以直接对IPA文件进行签名,同时支持修改BundleID, 不受描述文件 ...
- 使用RabbitMQ最终一致性库存解锁
一.基本介绍 ①延时队列(实现定时任务) 场景:比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品. 常用解决方案: spring的 schedule定时任务轮询数据库:缺点:消耗系统内存 ...
- 命令行获取chrome版本的多个方法
命令行获取chrome版本的多个方法 基于win10 测试 背景 在selenium的驱动安装中用webdriver_manager自动处理chromedriver是比较好的做法 webdriver_ ...
- C++ 重载运算符在HotSpot VM中的应用
C++支持运算符重载,对于Java开发者来说,这个可能比较陌生一些,因为Java不支持运算符重载.运算符重载本质上来说就是函数重载.下面介绍一下HotSpot VM中的运算符重载. 1.内存分配与释放 ...
- oracle的根容器下新建pdb容器及本地用户
在Oracle12C根容器下,新建pdb,要求根据种子pdb建目的pdb:db_test,配置监听:在目的pdb下建本地用户 首先根据种子pdb新建目的pdb 1.管理员身份登录 C:\WINDOWS ...
- c语言代码练习8
//输入两个数组,输出两个数字的最大公约数#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int n = ...