CF1205C Palindromic Paths
问题分析
首先可以想到,坐标和为奇数的位置可以被唯一确定。同样的,如果假定\((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的更多相关文章
- [USACO15OPEN]回文的路径Palindromic Paths
		[USACO15OPEN]回文的路径Palindromic Paths 题目描述 Farmer John's farm is in the shape of an N \times NN×N grid ... 
- TOJ 5020: Palindromic Paths
		5020: Palindromic Paths Time Limit(Common/Java):10000MS/30000MS Memory Limit:65536KByteTotal Su ... 
- 题解 P3126 【[USACO15OPEN]回文的路径Palindromic Paths】
		P3126 [USACO15OPEN]回文的路径Palindromic Paths 看到这题题解不多,蒟蒻便想更加通俗易懂地分享一点自己的心得,欢迎大佬批评指正^_^ 像这种棋盘形的两边同时做的dp还 ... 
- Educational Codeforces Round 89 (Rated for Div. 2)    C   Palindromic Paths
		题目链接:Palindromic Paths 题意: 给你一个n行m列的矩阵,这个矩阵被0或者1所填充,你需要从点(1,1)走到点(n,m).这个时候会有很多路径,每一条路径对应一个01串,你可以改变 ... 
- [USACO15OPEN]回文的路径Palindromic Paths 2.0版
		题目描述 农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记.比如说: ABCD BXZX CDXB WCBA 某一天,FJ从农场的左上角走到右 ... 
- Palindromic Paths(DP)
		描述 Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: A ... 
- [bzoj4098] [Usaco2015 Open]Palindromic Paths
		DP.. f[i][j][k]表示左上结束节点是第i条副对角线上的第j个点,右下结束节点是第n*2-i条副对角线上的第k个点,构成回文的方案数. i那维滚动一下.时间复杂度O(n^3)空间复杂度O(n ... 
- [Usaco2015 OPEN] Palindromic Paths
		[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4098 [算法] 显然 , 回文路径中第i个字母的位置(x , y)必然满足 : x ... 
- Codeforces 1205C Palindromic Paths (交互题、DP)
		题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ... 
随机推荐
- 常用的 Git 命令,给你准备好了!
			分支操作: git branch 创建分支 git branch -b 创建并切换到新建的分支上 git checkout 切换分支 git branch 查看分支列表 git branch -v 查 ... 
- 分层最短路(牛客第四场)--	free
			题意: 给你边权,起点和终点,有k次机会把某条路变为0,问你最短路是多长. 思路: 分层最短路模板题.题目有点坑(卡掉了SPFA,只能用dijkstra跑的算法). #include<iostr ... 
- 高效编程之 cProfile 性能分析
			写代码经常会听说一些名词,比如 性能分析.代码调优. cProfile 是 python 代码调优的一种工具,它能够统计在整个代码执行过程中,每个函数调用的次数和消耗的时间. 这个工具虽然很常用,但是 ... 
- redis集群搭建和哨兵模式以及AOF和RDB持久化
			Redis主从+哨兵模式 1.环境准备 (1)三台独立的linux主机 (2)IP分别为:10.150.200.182 (从) 10.150.200.184(从) 10.150.200.195(主) ... 
- python flask解决上传下载的问题
			记录瞬间 最近为了解决一些新的需求,简单介入了flask对文件的上传和下载的方法,并分别使用python和curl模拟发送 代码: #! /usr/bin/env python3 # coding:u ... 
- FastDFS集群部署(转载 写的比较好)
			FastDFS集群部署 之前介绍过关于FastDFS单机部署,详见博文:FastDFS+Nginx(单点部署)事例 下面来玩下FastDFS集群部署,实现高可用(HA) 服务器规划: 跟踪服务器1 ... 
- java实现spark常用算子之intersection
			import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ... 
- CSDN添加文章目录
			在发表的文章中,系统根据文章中H1到H6标签自动生成文章目录. 一.发表文章的时候合理使用“标题”标签. 二.目录生成.只要在文章中使用了“标题1”这样的功能,就可以在博文开头看到文章的目录. 
- P1:天文数据获取
			Step1:在sloan的casjob里http://casjobs.sdss.org/CasJobs/,密码用户 jiangbin 123456 查询满足条件的光谱对象,得到光谱对象的plate, ... 
- vi编辑器中删除文件中所有字符
			在命令模式下,将光标移动到文档最上方(使用gg命令),然后输入dG,删除工作区内所有缓存数据. 如果想要删除某行文档以下的内容,将光标移动到文档相应行,然后输入dG即可. 
