题目链接

问题分析

首先可以想到,坐标和为奇数的位置可以被唯一确定。同样的,如果假定\((1,2)\)是\(0\),那么坐标和为偶数的位置也可以被唯一确定。这样总共使用了\(n^2-3\)次询问。

那么接下来就需要在\(3\)步之内判断是否要翻转坐标和为偶数的位置。

如果仅仅只是这样简单的判断:

printf( "? 1 1 2 3\n" ); fflush( stdout );
int x; scanf( "%d", &x );
if( x == 1 && A[ 1 ][ 1 ] != A[ 2 ][ 3 ] )
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= n; ++j )
if( ( i + j ) % 2 )
A[ i ][ j ] = ( A[ i ][ j ] == 1 ) ? 0 : 1;
if( x == 0 && A[ 1 ][ 1 ] == A[ 2 ][ 3 ] &&
( A[ 2 ][ 1 ] == A[ 2 ][ 2 ] || A[ 1 ][ 2 ] == A[ 2 ][ 2 ] || A[ 1 ][ 2 ] == A[ 1 ][ 3 ] ) )
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= n; ++ j )
if( ( i + j ) % 2 )
A[ i ][ j ] = ( A[ i ][ j ] == 1 ) ? 0 : 1;

那么就愉快的Wrong Answer on test 5

观察这样一组数据:

110
101
110

会发现,不论是否翻转,所得的结果都是\(0\)。

观察发现,翻转会改变这样一条长度为\(4\)的路径上的两个位置。而这样路径上值的异或和是不变的。而长度为\(4\)的\(01\)串异或和为\(0\)是回文的必要条件。如果异或和不为\(0\),就会出现所给反例中的情况。

那么异或和为\(0\)的长度为\(4\)的路径是否一定存在?考虑反证法。

假设不存在这样一条路径。考虑从左上到右下的任意一条路径。这条路径的长度为\(2n-1\)。不妨设这条路径所组成的序列是\(\{a_i\}\)。那么\(a_1 \oplus a_2 \oplus a_3 \oplus a_4=1\),\(a_2\oplus a_3\oplus a_4\oplus a_5=1\)。那么\(a_1=a_5\)。同样的\(a_i=a_{i-4}\)。由于\(n\)是奇数,所以\(a_{2n-1}=a_1\)。 而题目中要求\(a_1=1,a_{2n-1}=0\),所以一定存在这样一条路径。

那么就得到了可行的做法。

参考程序

#include <bits/stdc++.h>
using namespace std; const int Maxn = 60;
int n, A[ Maxn ][ Maxn ], x; int Check( int x1, int y1, int x2, int y2 ) {
if( x1 == x2 ) return 1 ^ A[ x1 ][ y1 ] ^ A[ x1 ][ y1 + 1 ] ^ A[ x1 ][ y1 + 2 ] ^ A[ x1 ][ y2 ];
if( x1 + 1 == x2 ) {
int t = A[ x1 ][ y1 ] ^ A[ x2 ][ y2 ];
return ( t == ( A[ x1 + 1 ][ y1 ] ^ A[ x1 + 1 ][ y1 + 1 ] ) ) ||
( t == ( A[ x1 ][ y1 + 1 ] ^ A[ x1 + 1 ][ y1 + 1 ] ) ) ||
( t == ( A[ x1 ][ y1 + 1 ] ^ A[ x1 ][ y1 + 2 ] ) );
}
if( x1 + 2 == x2 ) {
int t = A[ x1 ][ y1 ] ^ A[ x2 ][ y2 ];
return ( t == ( A[ x1 + 1 ][ y1 ] ^ A[ x1 + 2 ][ y1 ] ) ) ||
( t == ( A[ x1 + 1 ][ y1 ] ^ A[ x1 + 1 ][ y1 + 1 ] ) ) ||
( t == ( A[ x1 ][ y1 + 1 ] ^ A[ x1 + 1 ][ y1 + 1 ] ) );
}
if( x1 + 3 == x2 ) return 1 ^ A[ x1 ][ y1 ] ^ A[ x1 + 1 ][ y1 ] ^ A[ x1 + 2 ][ y1 ] ^ A[ x2 ][ y1 ];
return 0;
} void Swap() {
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= n; ++j )
if( ( i + j ) % 2 )
A[ i ][ j ] = ( A[ i ][ j ] == 1 ) ? 0 : 1;
return;
} void Trans() {
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= n; ++j )
for( int k = 0; k < 4; ++k )
if( i + k <= n && j + 3 - k <= n && Check( i, j, i + k, j + 3 - k ) ) {
printf( "? %d %d %d %d\n", i, j, i + k, j + 3 - k ); fflush( stdout ); scanf( "%d", &x );
if( x == 1 && A[ i ][ j ] != A[ i + k ][ j + 3 - k ] ) Swap();
if( x == 0 && A[ i ][ j ] == A[ i + k ][ j + 3 - k ] ) Swap();
return;
}
return;
} int main() {
memset( A, 0, sizeof( A ) );
A[ 1 ][ 1 ] = 1;
scanf( "%d", &n );
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= n; ++j ) {
if( i == 2 && j == 1 ) {
printf( "? 2 1 2 3\n" ); fflush( stdout ); scanf( "%d", &x );
if( x == 0 ) A[ 2 ][ 1 ] = ( A[ 2 ][ 3 ] == 1 ) ? 0 : 1;
if( x == 1 ) A[ 2 ][ 1 ] = ( A[ 2 ][ 3 ] == 1 ) ? 1 : 0;
}
if( i == 1 && j + 2 <= n ) {
printf( "? %d %d %d %d\n", i, j, i, j + 2 ); fflush( stdout ); scanf( "%d", &x );
if( x == 0 ) A[ i ][ j + 2 ] = ( A[ i ][ j ] == 1 ) ? 0 : 1;
if( x == 1 ) A[ i ][ j + 2 ] = ( A[ i ][ j ] == 1 ) ? 1 : 0;
}
if( j == 1 && i + 2 <= n ) {
printf( "? %d %d %d %d\n", i, j, i + 2, j ); fflush( stdout ); scanf( "%d", &x );
if( x == 0 ) A[ i + 2 ][ j ] = ( A[ i ][ j ] == 1 ) ? 0 : 1;
if( x == 1 ) A[ i + 2 ][ j ] = ( A[ i ][ j ] == 1 ) ? 1 : 0;
}
if( i + 1 <= n && j + 1 <= n && i + j + 2 < n + n ) {
printf( "? %d %d %d %d\n", i, j, i + 1, j + 1 ); fflush( stdout ); scanf( "%d", &x );
if( x == 0 ) A[ i + 1 ][ j + 1 ] = ( A[ i ][ j ] == 1 ) ? 0 : 1;
if( x == 1 ) A[ i + 1 ][ j + 1 ] = ( A[ i ][ j ] == 1 ) ? 1 : 0;
}
}
Trans();
printf( "!\n" ); fflush( stdout );
for( int i = 1; i <= n; ++i ) {
for( int j = 1; j <= n; ++j )
printf( "%d", A[ i ][ j ] ), fflush( stdout );
printf( "\n" ); fflush( stdout );
}
return 0;
}

CF1205C Palindromic Paths的更多相关文章

  1. [USACO15OPEN]回文的路径Palindromic Paths

    [USACO15OPEN]回文的路径Palindromic Paths 题目描述 Farmer John's farm is in the shape of an N \times NN×N grid ...

  2. TOJ 5020: Palindromic Paths

    5020: Palindromic Paths  Time Limit(Common/Java):10000MS/30000MS     Memory Limit:65536KByteTotal Su ...

  3. 题解 P3126 【[USACO15OPEN]回文的路径Palindromic Paths】

    P3126 [USACO15OPEN]回文的路径Palindromic Paths 看到这题题解不多,蒟蒻便想更加通俗易懂地分享一点自己的心得,欢迎大佬批评指正^_^ 像这种棋盘形的两边同时做的dp还 ...

  4. Educational Codeforces Round 89 (Rated for Div. 2) C Palindromic Paths

    题目链接:Palindromic Paths 题意: 给你一个n行m列的矩阵,这个矩阵被0或者1所填充,你需要从点(1,1)走到点(n,m).这个时候会有很多路径,每一条路径对应一个01串,你可以改变 ...

  5. [USACO15OPEN]回文的路径Palindromic Paths 2.0版

    题目描述 农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记.比如说: ABCD BXZX CDXB WCBA 某一天,FJ从农场的左上角走到右 ...

  6. Palindromic Paths(DP)

    描述 Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: A ...

  7. [bzoj4098] [Usaco2015 Open]Palindromic Paths

    DP.. f[i][j][k]表示左上结束节点是第i条副对角线上的第j个点,右下结束节点是第n*2-i条副对角线上的第k个点,构成回文的方案数. i那维滚动一下.时间复杂度O(n^3)空间复杂度O(n ...

  8. [Usaco2015 OPEN] Palindromic Paths

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4098 [算法] 显然 , 回文路径中第i个字母的位置(x , y)必然满足 : x ...

  9. Codeforces 1205C Palindromic Paths (交互题、DP)

    题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ...

随机推荐

  1. P4942小凯的数字

    给定一个序列,如12345 56789 1011121314等,输出对其取余9的结果. 那么我们需要明白一个定理,一个序列对一个数的取余结果等于它各位之和取余那个数的结果.证明似乎是这样∑i=0n​a ...

  2. Luogu P4878 [USACO05DEC]布局

    题目 差分约束模板. 注意判负环需要建一个超级源点到每个点连一条\(0\)的边.因为\(1\)不一定能到达所有的点. #include<bits/stdc++.h> #define pi ...

  3. golang 组装返回json数据,提供api接口

    model里 package model type Setting struct { Key string `gorm:"primary_key" json:"key&q ...

  4. spark教程(六)-Python 编程与 spark-submit 命令

    hadoop 是 java 开发的,原生支持 java:spark 是 scala 开发的,原生支持 scala: spark 还支持 java.python.R,本文只介绍 python spark ...

  5. 2016 计蒜之道 初赛 第一场 D 青云的机房组网方案 (虚树)

    大意: 给定树, 点$i$的点权为$a_i$, 求$\sum\limits_{a_i \perp a_j}dis(i,j)$ 中等难度可以枚举每条边的贡献, 维护子树内每个数出现次数$a$, 转化为求 ...

  6. Two strings CodeForces - 762C (字符串,双指针)

    大意: 给定字符串$a$,$b$, $b$可以任选一段连续的区间删除, 要求最后$b$是$a$的子序列, 求最少删除区间长度. 删除一段连续区间, 那么剩余的一定是一段前缀和后缀. 判断是否是子序列可 ...

  7. 通过设置访问密码查看Tomcat服务器运行状态

    安装tomcat 设置访问manager用户名,密码 vim /usr/local/tomcat9/conf/tomcat-users.xml # 设置访问manager用户名,密码 # 在倒数第二行 ...

  8. wpf GridSplitter左右托不了或者拖拽异常

    对于水平分割线,需要将verticalAlignment属性设置为Center 对于垂直分割线,需要将horizontalAlignment属性设置为center 切记切记,不然很苦逼....

  9. 重学HTML5的语义化

    干了这么多年的前端,之前面试的时候经常会遇到面试官提问:你是如何理解HTML的语义化的? 说实话,之前遇到这个问题的时候,都是从网上找参考答案,然后记下来,用自己的语言重新组织一下,就变成自己的理解了 ...

  10. feign 多参数问题

    参考: https://stackoverflow.com/questions/43604734/springboot-feignclient-method-has-too-many-paramter ...