2.已知维数求超立方体邻接矩阵

成绩 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一致)

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 2↵
  2. 0 1 2 3↵
以文本方式显示
  1. 0 1 1 0↵
  2. 1 0 0 1↵
  3. 1 0 0 1↵
  4. 0 1 1 0↵
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; 
}*/  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值