您的位置:首页 > 其它

all possible patterns for N russian squares

2014-12-15 08:37 267 查看
Question:

A traditional russion square is made by 4 blocks, and has 7 different patterns.
Given N blocks, how many different patterns would be.

N = 1, P# = 1
N = 2, P# = 1
N = 3, P# = 3
N = 4, P# = 7.

Assume N = k, P# = Pk
then when N = k+1, P# = for each P in Pk, append one more block around P, remove dups.
class Pattern
{
List<Block> blocks;

// Return true if this pattern can be translated to another patter p by rotate or moving.
boolean isSame(Pattern p)
{
// TODO
}
}

List<Pattern> allPatthens(n)
{
if (n == 1)
{
return Pattern.builder().build();
}

List<Pattern> patternsForNMinusOne = numOfPattern(n - 1);
List<Pattern> toReturn = new ArrayList<>();
for (Pattern p : patternsForNMinus1)
{
List<Pattern> patternsWithOneMoreBlock = patternsWithOneMoreBlock(p);
for (Pattern newP : patternsWithOneMoreBlock)
{
if (!contains(toReturn, newP))
{
toReturn.add(newP);
}
}
}

return toReturn;
}

boolean contains(List<Pattern> list, Pattern p)
{
for (Pattern pInList : list)
{
if (pInList.isSame(p))
return true;
}
return false;
}

// Given pattern p.
// Return all unique valid patterns with one more block.
List<Pattern> patternsWithOneMoreBlock(Pattern p)
{
List<Pattern> toReturn = new ArrayList<>();
for (Block b : p.blocks())
{
List<Block> newBlocks = Arrays.as(b.left(), b.right(), b.up(), b.down());
for (Block newBlock : newBlocks)
{
if (!p.contains(newBlock))
{
// A new pattern found
Pattern newP = p.appendBlock(newBlock);
if (!contains(toReturn, newP))
{
toReturn.add(newP);
}
}
}
}
return toReturn;
}

// Too complicated.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  interview