algorithm - 我可以在解决这个算法相关问题时寻求一些指导吗?

标签 algorithm language-agnostic

在我的空闲时间,我喜欢通过解决 topcoder.com 或 uva.onlinejudge.com 等页面上的问题来提高我的算法/编程技能(好吧,我的技能很烂,我试图提高它们)。通常我可以为更简单的问题编写和编写正确的算法——我理解大多数关于递归或图形的基本概念。

问题是,大多数时候,我无法解决更难的问题。至于现在,我偶然发现了这个(在 spoj.pl 上):

Little Johnny is playing with his small magical stamp, trying to draw a bunny on a piece of paper that is a square k by k divided into unit squares with side 1. Johnny’s stamp is a square with side 3 and consists of smaller squares with side 1. Exactly two of these squares are protuberant. Moreover, both protuberant squares are in the same row or in the same column. If Johnny wants to draw pictures using this stamp, he presses it to the piece of paper in such a way that its protuberant squares exactly match some squares of the piece of paper. If some protuberant square touches the piece of paper, the touched square on the piece of paper changes its color — from black to white or from white to black. The small stamp may lay partially outside the piece of paper, but the protuberant squares always have to lay inside. The stamp can be shifted in any way, but it cannot be rotated.

In the beginning the piece of paper is whole white. The bunny consists of some number of squares that are black (all the remaining ones have to be white). Johnny tried to draw the bunny with his small stamp for quite a long time, but he did not succeed (this does not necessarily mean that the bunny cannot be drawn, but only that it is very difficult to draw pictures on such a large piece of paper using such a small stamp!). So he asked his older brother, big John, for help.

Big John can help little Johnny by giving him his big magical stamp. The big stamp has size s by s and has an arbitrary number of protuberant squares (these squares do not necessarily need to be located in the same row or column). This stamp works just like the small stamp, but enforces one additional constraint — it can only be pressed at the piece of paper if it lies totally inside the piece of paper.

Before big John gives little Johnny his big stamp, he would like to make sure that the stamps used together are sufficient to draw the bunny. He asked you for help in determining that. Input

The first line of the standard input contains one integer t (1 ≤ t ≤ 10) denoting the number of test cases.

A description of a single test case starts with a line with two integers s and k (1 ≤ s ≤ k ≤ 1000, 1 ≤ s ≤ 200) separated by a single space. They denote the size of big John’s stamp and the size of the piece of paper.

The following three lines contain a description of the little Johnny’s stamp. Each of these lines contains three characters 0 or 1. Such a description shows how does a white piece of paper look like after pressing the small stamp: 0 represents a white square, and 1 — a black square. Exactly two characters in these three lines are ones and are both located either in the same row or in the same column. Please note that such description does not illustrate the design of the stamp itself — the stamp is symmetric to the figure drawn by it on the piece of paper.

The following s lines contain a description of the big John’s stamp in a similar format; this description may, however, contain an arbitrary number of ones. The following k lines describe the bunny, in the same format as the one used in the descriptions of stamps. A one represents a black square, whereas a zero — a white square.

Output

For each test case write out to the standard output a single line with a word "YES" (without quotation marks) or "NO", depending on whether the bunny from the test case can be drawn using the stamps from the test case (together).

Example

For the input data:

2 
3 8
010
000 
010
000
010
011
01100000   
00100000   
00010000   
00001100   
00011110   
10111100  
01111100   
01111110  
5 10  
001   
001  
000 
00000  
10100 
00001
00001
00100
0011110000
0000111000
0010011100
0111001110
1110000000
1101001000
1000001100
0110110110
0001001000
0000110000

the correct output is:

NO
YES

诀窍在于,我可以编写简单的解决方案,但这并不意味着我可以编写困难的解决方案。这类似于事实,在某些游戏中,达到一定水平后,杀死弱小的敌人不会给你任何(或非常低的)经验。

我不需要任何解决方案或现成的算法 - 但我可以要求一些指导吗?

尝试解决此类(或特定问题)问题时,正确的思维方式是什么?

最佳答案

解决问题的本质在于,它是应用您当前拥有的知识和灵光一闪的洞察力的结合。我不认为会有一种“正确”的思维方式。相反,我建议您组合一系列策略来处理问题。诸如此类的事情(这些不一定适用于这个问题,但我观察到自己在解决问题时会做这些事情)

  • 确保您真正理解了问题,并尝试一下(事实上,我认为这是“正确”的做法)
  • 列出你所知道的,在列表中寻找模式
  • 尝试解决相反的问题,而不是证明什么可以做,而是确定什么不能做
  • 手动解决一些问题,看看是否出现了一些常见的模式
  • 解决一个更简单的问题 - 分而治之

遇到问题时发生的一件有趣的事情是,如果您“玩弄”它们,就会在您停止思考问题之后突然想到很多意想不到的想法。

在这种情况下,我想知道,给定几个标记,你如何识别无法设置的像素......嗯必须取决于空白的模式......看我们正在考虑逆向问题- 我们绘制的内容。

关于algorithm - 我可以在解决这个算法相关问题时寻求一些指导吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496641/

相关文章:

language-agnostic - 查询语言的运算符 OR 的优先级是否应该高于 AND 的优先级?

language-agnostic - 为什么使用 "do while"循环?

c++ - 在这四个库中,您最有可能使用哪个?

algorithm - 带权重的 Karger 算法

algorithm - 智能路径截断/省略号显示

c++ - 倒水 : Graph Implementation Problem - Shortest Path/Dijkstra's (? )

algorithm - 这是什么压缩算法?

variables - 为什么变量 "i"和 "j"用于计数器?

algorithm - 快速排序,其中数组中的第一个元素较小

performance - 查找 double 值最大值的最有效算法