【发布时间】:2016-03-25 11:16:04
【问题描述】:
我用 C/C++ 开发了一个部分游戏,其中瓷砖被交换Here。 我现在想实现糖果粉碎,我知道画糖果需要很多努力。让瓷砖完成这项工作。 在为瓷砖分配颜色的部分中,我不希望三种颜色出现在一行或一列中。我如何以有效的方式做到这一点。 我目前正在像这样随机分配颜色:
board[i][j].color=rand()%3;
是的,我不希望一行或一列中的三个单元格或图块具有相同的颜色,即不超过两个相同颜色的相邻图块。 我的意思是我不想要一个颜色被分配一次并且检查一行中的三个瓷砖是否具有相同颜色的解决方案。如果没有再次为所有图块生成颜色。那将太天真和昂贵。 另一种解决方案可能是在按光栅顺序将颜色分配给图块之前,检查下方或左侧的两个图块是否具有相同的颜色,如果分配了其他颜色。这也是显而易见的。有没有更好的办法?
在 Weather Wane 的回答之后,我发布了使用 STL 迭代器和 set_difference 方法执行设置差异操作的代码。我正在尝试的是在从一组颜色中随机选择之前,我通过使用集合操作仅消除已经重复两次(下方或左侧)的那些颜色来形成该集合。代码有问题。我对STL了解不多。谁能指导我如何正确使用它。
for(j=0;j<maxy;j++)
{for(i=0;i<maxx;i++)
{
int first[] = {0,1,2,3},fsize,i34;
std::vector<int> v(5);
std::vector<int>::iterator it;
board[i][j].x0=x0+i*dx+1;
board[i][j].x1=x0+(i+1)*dx-1;
board[i][j].y0=y0+j*dy+1;
board[i][j].y1=y0+(j+1)*dy-1;
if((i-1)>=0&&board[i-1][j].color==0&&(i-2)>=0&&board[i-2][j].color==0)
{int second[] = {0};
std::sort (first,first+4);
it=std::set_difference (first, first+4, second, second+1, v.begin());
v.resize(it-v.begin());
std::copy(v.begin(), v.end(), first);
}
fsize=v.size();
if((i-1)>=0&&board[i-1][j].color==1&&(i-2)>=0&&board[i-2][j].color==1)
{int second[] = {1};
std::sort (first,first+fsize); // 5 10 15 20 25
it=std::set_difference (first, first+fsize, second, second+1, v.begin());
// 5 15 25 0 0 0 0 0 0 0
v.resize(it-v.begin()); // 5 15 25
std::copy(v.begin(), v.end(), first);
}
fsize=v.size();
if((i-1)>=0&&board[i-1][j].color==2&&(i-2)>=0&&board[i-2][j].color==2)
{int second[] = {2};
std::sort (first,first+fsize); // 5 10 15 20 25
it=std::set_difference (first, first+fsize, second, second+1, v.begin());
// 5 15 25 0 0 0 0 0 0 0
v.resize(it-v.begin()); // 5 15 25
std::copy(v.begin(), v.end(), first);
}
fsize=v.size();
if((j-1)>=0&&board[i][j-1].color==0&&(j-2)>=0&&board[i][j-2].color==0)
{int second[] = {0};
std::sort (first,first+fsize); // 5 10 15 20 25
it=std::set_difference (first, first+fsize, second, second+1, v.begin());
// 5 15 25 0 0 0 0 0 0 0
v.resize(it-v.begin()); // 5 15 25
std::copy(v.begin(), v.end(), first);
}
fsize=v.size();
if((j-1)>=0&&board[i][j-1].color==1&&(j-2)>=0&&board[i][j-2].color==1)
{int second[] = {1};
std::sort (first,first+fsize); // 5 10 15 20 25
it=std::set_difference (first, first+fsize, second, second+1, v.begin());
// 5 15 25 0 0 0 0 0 0 0
v.resize(it-v.begin()); // 5 15 25
std::copy(v.begin(), v.end(), first);
}
fsize=v.size();
if((j-1)>=0&&board[i][j-1].color==2&&(j-2)>=0&&board[i][j-2].color==2)
{int second[] = {2};
std::sort (first,first+fsize); // 5 10 15 20 25
// 10 20 30 40 50
it=std::set_difference (first, first+fsize, second, second+1, v.begin());
// 5 15 25 0 0 0 0 0 0 0
v.resize(it-v.begin()); // 5 15 25
std::copy(v.begin(), v.end(), first);
}
// first=&v[0];
fsize=v.size();
cout<<v.size()<<" ";
for(i34=0,it=v.begin();it!=v.end();it++)
{cout<<*it<<" "; first[i34++]=*it;}
cout<<" ";
if(v.size()>0&&v.size()!=5)
board[i][j].color=first[rand()%i34];
else if (v.size()==5) board[i][j].color=first[rand()%4];
}
cout<<"\n";
}
【问题讨论】:
-
看起来像一些动态规划问题。你可能需要在这个领域搜索一些算法,我相信有一个解决方案。无法从我的脑海中得到这个名字。
-
从问题中不清楚限制是否是 a) 在整行或整列中不超过 2 种不同颜色,b) 不超过 2 块任何一种颜色,或 c) 不超过超过 2 个相邻颜色匹配的图块。