33,027
社区成员




/*
算法思想:
维护一个所有同色相邻珠子集合的容器,和一个标记每个珠子属于哪个集合的二维数组
依次检查每一个珠子,如果与已分配集合的珠子(具体点,就是上方的 和 左边的)颜色相同,就把这个珠子加入到此集合
否则为该珠子分配一个新的集合。
当检查完每个珠子,那么每个珠子都分派到一个集合。
证明:反证
算法结束后,如果存在两个相邻且颜色相同的珠子B,C没有在同一个集合SB中,设珠子B在C的左上方。
那么珠子C在B的右下方,并且与B的颜色相同。根据算法结果,C与B在同一个集合中。矛盾产生。
*/
#include <iostream>
#include <vector>
using namespace std;
const int MAXN=5; //矩形的边长
vector< vector<int> > s; //开辟一个vector<vector<int>>类型s容器,用于维护所有的集合;
int index[MAXN][MAXN]; //一个数组Index,保存每个珠子集合的的序号
int color[MAXN][MAXN]; //珠子的颜色数组
int main()
{
int n = MAXN;
//初始化珠子数组的颜色
for(int k=0; k<n; k++)
{
for(int l=0; l<n; l++)
{
color[k][l] = k*l%5;
}
}
//核心代码
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i-1>=0 &&color[i-1][j]==color[i][j]) //如果此珠子与上方的珠子相同
{
index[i][j] = index[i-1][j]; //标记i*n+j+1珠子与上方的珠子同属于一个集合
s[index[i][j]].push_back(i*n+j+1); //将第i*n+j+1珠子加入所在集合
}
else if(j-1>=0 && color[i][j-1] == color[i][j]) //如果此珠子与左边的珠子相同
{
index[i][j] = index[i][j-1]; //标记i*n+j+1珠子与左边珠子同属于一个集合
s[index[i][j]].push_back(i*n+j+1); //将第i*n+j+1珠子加入所在集合
}
else //直到现在,珠子还没有相邻的珠子
{
index[i][j] = s.size(); //标记i*n+j+1珠子属于一个新的集合
vector<int> v;
v.push_back(i*n+j+1);
s.push_back(v); //为i*n+j+1珠子建立一个新的集合。
}
}
}
//输出
for(vector< vector<int> >::iterator it1= s.begin(); it1 != s.end(); it1++)
{
for(vector<int>::iterator it2= (*it1).begin(); it2 != (*it1).end(); it2++)
{
cout<<*it2<<" ";
}
cout << endl;
}
return 0;
}
/*
算法思想:
维护一个所有同色相邻珠子集合的容器,和一个标记每个珠子属于哪个集合的二维数组
依次检查每一个珠子,如果与已分配集合的珠子(具体点,就是上方的 和 左边的)颜色相同,就把这个珠子加入到此集合
否则为该珠子分配一个新的集合。
当检查完每个珠子,那么每个珠子都分派到一个集合。
证明:反证
算法结束后,如果存在两个相邻且颜色相同的珠子B,C没有在同一个集合SB中,设珠子B在C的左上方。
那么珠子C在B的右下方,并且与B的颜色相同。根据算法结果,C与B在同一个集合中。矛盾产生。
*/
#include <iostream>
#include <string>
using namespace std;
const int MAXN=5; //矩形的边长
vector< vector<int> > s; //开辟一个vector<vector<int>>类型s容器,用于维护所有的集合;
int index[MAXN][MAXN]; //一个数组Index,保存每个珠子集合的的序号
int color[MAXN][MAXN]; //珠子的颜色数组
int main()
{
int n = MAXM;
//初始化珠子数组的颜色
for(int k=0; k<n; k++)
{
for(int l=0; l<n; l++)
{
color[k][l] = k*l%5;
}
}
//核心代码
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i-1>=0 &&color[i-1][j]==color[i][j]) //如果此珠子与上方的珠子相同
{
index[i][j] = index[i-1][j]; //标记i*n+j+1珠子与上方的珠子同属于一个集合
s[index[i][j]].push_back(i*n+j+1); //将第i*n+j+1珠子加入所在集合
}
else if(j-1>=0 && color[i][j-1] == color[i][j]) //如果此珠子与左边的珠子相同
{
index[i][j] = index[i][j-1]; //标记i*n+j+1珠子与左边珠子同属于一个集合
s[index[i][j]].push_back(i*n+j+1); //将第i*n+j+1珠子加入所在集合
}
else //直到现在,珠子还没有相邻的珠子
{
index[i][j] = s.size(); //标记i*n+j+1珠子属于一个新的集合
vector<int> v;
v.push_back(i*n+j+1);
s.push_back(v); //为i*n+j+1珠子建立一个新的集合。
}
}
}
//输出
for(vector< vector<int> >::iterator it1= s.begin(); it1 != s.end(); it1++)
{
for(vector<int>::iterator it2= (*it1).begin(); it2 != (*it1).end(); it2++)
{
cout<<*it2<<" ";
}
cout << endl;
}
return 0;
}