成绩 | 5 | 开启时间 | 2017年11月24日 星期五 00:00 |
折扣 | 0.8 | 折扣时间 | 2017年12月18日 星期一 00:00 |
允许迟交 | 否 | 关闭时间 | 2017年12月31日 星期日 00:00 |
题目:n维超立方体是在n维空间中对三维空间立方体的类比,下图便是一个4维超立方体在三维空间中的投影及该立方体在三维空间的展开图
给超立方体的各顶点编号后,就可以按照一定规则写出其邻接矩阵。请同学们根据下图寻找规律,对于给定的顶点编号序列,写出对应的超立方体的邻接矩阵。
输入:
维数n,顶点的编号序列a(0<=n<=7)
输出:
对应的超立方体的邻接矩阵(顶点顺序需与a一致)
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<map>
using namespace std;
int main()
{
//freopen("1.txt", "r", stdin);
int div; int adjec[128][128] = {0};
int result[128][128] = { 0 };
map<int, int> points;
scanf("%d", &div);
for (int i = 0; i <= div; i++) //计算div+1次
{
int tmp = pow(2.0, i - 1); //div-1维的矩阵边长
int p = 0;
for (int k = tmp; k < 2*tmp ; k++) //两侧单位矩阵
{
adjec[p][k] = adjec[k][p] = 1;
p++;
}
for (int m = 0; m < tmp; m++) //复制主对角矩阵
{
for (int n = 0; n < tmp; n++)
{
adjec[m + tmp][n + tmp] = adjec[m][n];
}
}
}
int num; int i = 0;
while (scanf("%d", &num) != EOF)
{
points.insert(pair<int, int>(num, i));
i++;
}
int index = pow(2.0, div);
for (int i = 0; i < index - 1; i++)
{
for (int j = i+1; j < index; j++)
{
if (adjec[i][j])
{
int a = points.find(i)->second; int b = points.find(j)->second;
result[a][b] = result[b][a] = 1;
}
}
}
for (int i = 0; i < index; i++)
{
for (int j = 0; j < index; j++)
{
if (j == index - 1)
printf("%d\n", result[i][j]);
else
printf("%d ", result[i][j]);
}
}
return 0;
}
/*#include<stdio.h>
#include<math.h>
#include<string.h>
int points[128];
int adjec[130][130];
int a1[2][2] = { 0, 1, 1, 0 };
int main()
{
//freopen("1.txt", "r", stdin);
int div;
scanf("%d%*c", &div);
int point = pow(2.0, div);
int num; int all = 0;
while (scanf("%d", &num) != EOF)
{
points[all++] = num;
}
if (div == 0) //0维时的情况
{
printf("0\n");
return 0;
}
if (div == 1) //1维时的情况
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
if (j == 1)
printf("%d\n", a1[i][j]);
else
printf("%d ", a1[i][j]);
}
}
return 0;
}
adjec[0][1] = 1; adjec[1][0] = 1; //大于等于2维时的情况
for (int i = 2; i <= div; i++)
{
int tmp = (pow(2.0, i) / 2);
for (int m = 0; m < tmp; m++)
{
for (int n = 0; n < tmp; n++)
{
adjec[m + tmp][n + tmp] = adjec[m][n];
}
}
int p = 0;
for (int k = tmp; k < 2 * tmp; k++)
{
adjec[p][k] = adjec[k][p] = 1;
p++;
}
}
for (int i = 0; i < all; i++)
for (int j = 0; j < point; j++)
{
int tmp = points[i];
if (j == point - 1)
printf("%d\n", adjec[tmp][j]);
else
printf("%d ", adjec[tmp][j]);
}
return 0;
}*/