matlab代码练习二

competition

  • 提取12345和67899这两个五位数的每一位数字,并把他们存储到一个2*5的矩阵里。

    • 要求矩阵第一行是12345从万位到个位的所有位数字,第二行为67899从个位到万位的所有位数字
      1
      2
      3
      4
      5
      6
      clc,clear;
      a=12345;
      b=67899;
      a=str2num(num2str(a)')';
      b=fliplr(str2num(num2str(b')')');
      [a;b]
  • 以pi/100为间隔,比较函数sin(2x+3)和cos(3x-1)在0到2π的函数值大小,只画出函数值相对较大的那一部分图像。

    1
    2
    3
    4
    5
    6
    clc;clear;
    close all;
    x=0:pi/100:2*pi;
    y1=sin(2*x+3);
    y2=cos(3*x-1);
    plot(x,max(y1,y2));
  • 有如下数列:1 3 59 8 74 2 1 3 46 8 7 4 5 6 9 8 5 4 22 25 52 32 64 62 13 1 61 31 31 32 15 4 54 32 24 23 24 15 21 10 30 45 56 14 24 34 13 21 24 23 35 26 15 14 12 13 142 412 43 16 23 4 55 25 21 24 34 12 34 12 43 12 43 14 23 14 12 23 14 21 23 74 14 ;

    • 求出数列中每个数出现的次数.
    • 并按原序列先后顺序输出(其中相同的数字只保留第一次出现的)。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      clc,clear;
      a=[1 3 59 8 74 2 1 3 46 8 ...
      7 4 5 6 9 8 5 4 ...
      22 25 52 32 64 62 13 ...
      1 61 31 31 32 15 4 54 32 ...
      24 23 24 15 21 10 30 45 56 ...
      14 24 34 13 21 24 23 35 26 ...
      15 14 12 13 142 412 43 16 23 ...
      4 55 25 21 24 34 12 34 12 ...
      43 12 43 14 23 14 12 ...
      23 14 21 23 74 14];
      A=unique(a,'stable')
      for i=1:length(A)
      [m,n]=find(a==A(i));
      if length(m)>=2
      %用的好,因为find函数放回的是向量(若向量长度大于2,那么说明该数的横坐标有多个,所以出现了多次)
      disp(strcat(num2str(A(i)),'重复',num2str(length(m)),...
      '次','位置为:',mat2str([m n])))
      end
      end
  • 随机生成四组坐标,判断第四个点是否在前三个点构成的三角形内(不包括线上),并画出图像,计算精度为5位有效数字。

    • (海伦公式:假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:..而公式里的p为周长的一半)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      clc,clear;
      a=rand(4,2);
      d=squareform(pdist(a));
      f=@(a,b,c)sqrt((a+b+c)/2*((a+b+c)/2-a)*((a+b+c)/2-b)*((a+b+c)/2-c));
      s1=f(d(1,2),d(1,3),d(2,3));
      s2=f(d(1,2),d(1,4),d(2,4))+f(d(1,3),d(1,4),d(3,4))+f(d(3,2),d(3,4),d(2,4));
      if vpa(s1,5)==vpa(s2,5)
      fprintf('第四个点在前三个点组成的三角形内')
      else
      fprintf('第四个点不在前三个点组成的三角形内')
      end
      x=a(:,1)';y=a(:,2)';
      x1=[x(1:3) x(1)];y1=[y(1:3) y(1)];
      plot(x1,y1,'b-')%用plot画封闭曲线需要在最后添上第一个点的坐标
      text(x+0.01,y+0.01,{'1' '2' '3' '4'})
      hold on
      plot(x,y,'ro')
      s1-s2
  • 这题跟算法博弈不一样,matlab。。。。

  • CTGUMCM是一个大佬云集的地方。已知矩阵a如图4所示,其中1表示大佬,0表示小白。

    • (1)在这里大佬小白各有多少位呢?试分别统计,并将大佬们的位置存储在矩阵z中。
    • (2)大佬们在这里喜欢抱团。我们称位置(x,y)与其上下左右四个位置(x,y+1),(x,y-1), (x+1,y),(x-1,y)是相邻的。如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“大佬集”,试求矩阵a中“大佬集”的个数。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      clc,clear;
      a = [0 1 1 1 0 0 1
      0 0 1 0 0 0 0
      0 0 0 0 1 0 0
      0 0 0 1 1 1 0
      1 1 1 0 1 0 0
      1 1 1 1 0 0 0];
      [x,y] = find(a == 1);
      a1 = length(x);
      z = [x y];
      [x1,y1] = find(a == 0);
      b1 = length(x1);
      fprintf('大佬有%d位\n',a1);
      fprintf('小白有%d位\n',b1);
      fprintf('大佬们的位置');
      disp(z);
      %%*******第二问********%%
      clc,clear;
      global a z
      z=0;
      %a=[0 0 0 0 0;0 1 1 0 0;0 1 0 1 0;0 0 1 1 0;0 0 0 0 0];
      a=[0 0 0 0 0 0 0 0 0;0 0 1 1 1 0 0 1 0;0 0 0 1 0 0 0 0 0;0 0 0 0 0 1 0 0 0;0 0 0 0 1 1 1 0 0;0 1 1 1 0 1 0 0 0;0 1 1 1 1 0 0 0 0;0 0 0 0 0 0 0 0 0;];
      [ax,ay]=size(a);
      for i0=1:ax
      for j0=1:ay
      bfs(i0,j0)
      end
      end
      fprintf('矩阵a中共有%d个大佬集\n',z)
      function bfs(x0,y0)
      global a z
      x=x0;y=y0;k=0;
      x1=[0 0 -1 1];y1=[1 -1 0 0];
      if a(x0,y0)==1
      while length(x)~=0
      k=k+1;
      for i=1:4
      newx=x(1)+x1(i);newy=y(1)+y1(i);
      if a(newx,newy)==1
      x=[x,newx];y=[y,newy];
      end
      end
      a(x(1),y(1))=0;
      x(1)=[];y(1)=[];
      end
      if k>1
      z=z+1;
      end
      end
      end
  • 在青青草原旁边的小树林里,有两头爱吃蜂蜜的小熊熊。熊大做了一个5*5的VIP单层蜂箱,熊二找到了5只小蜜蜂5只大蜜蜂,它们都表示愿意住在里面,但提出了要求:每只蜜蜂独占一个小房间,且相同大小的蜜蜂不能在同一行、同一列、同一对角线上。聪明的你能帮助小熊熊们设计出10只蜜蜂的居住方案吗

    • (1)请编程输出一种满足所有条件的方案
    • (2)请编程输出所有方案,并统计共有多少方案。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      %%*******B卷第五题********%%
      clc,clear;
      n=5;
      z=0;
      zzz=[];
      for a1=1:5
      for a2=1:5
      for a3=1:5
      for a4=1:5
      for a5=1:5
      a=[a1 a2 a3 a4 a5];%行号
      if length(unique(a))==5
      zz=0;
      for i=1:4%列号
      for j=i+1:5
      if ((a(i)+i)==(a(j)+j))||((a(i)-a(j))==(i-j))
      zz=1;
      break
      end
      end
      if zz==1
      break
      end
      end
      if i==4&&j==5
      z=z+1;
      zzz=[zzz;a];
      end
      end
      end
      end
      end
      end
      end
      z
      zzz
      z2=0;
      [x,y]=size(zzz);
      for i=1:y-1
      for j=i+1:y
      if length(find(zzz(i,:)-zzz(j,:)))==5
      [zzz(i,:);zzz(j,:)]
      z2=z2+1;
      end
      end
      end
      fprintf('一共有%d种方案\n',z2);
      %TAKE IT EASY.JUST HAVE FUN!
------ The Happy Ending ------