矩阵搜索c语言,【算法】矩阵填数,深度优先搜索(DFS),Pascal改C语言

面向对象的上机实验

题目

以下列方式向 5*5 矩阵中填入数字。设数字i(1=

1)(E, W)=(x±3,y)

2)(E, W)=(x,y±3)

3)(E, W)=(x±2,y±2)

求解问题如下:

编写一个程序,当数字1被指定于某个起始位置时,列举出其它24个数字应在的位置;列举该条件下的所有可能方案。

参考答案

网上搜索到数学奥赛中本题的Pascal代码

来自http://blog.sina.com.cn/s/blog_1317189490102vp1k.html

1 Program lx9_1_3;

2 uses crt;

3 const n=5;

4 d:array[1..8,1..2] of shortint=((3,0),(-3,0),(0,3),(0,-3),

5 (2,2),(2,-2),(-2,2),(-2,-2));

6 var x0,y0:byte;

7 a:array[1..n,1..n] of byte;

8 total:longint;

9

10 procedure print;

11 var i,j:integer;

12 begin

13 inc(total);

14 gotoxy(1,3);

15 writeln('[',total,']');

16 for i:=1 to n do

17 begin

18 for j:=1 to n do

19 write(a[i,j]:3);

20 writeln;

21 end;

22 end;

23

24 procedure try(x,y,k:byte);

25 var i,x1,y1:integer;

26 begin

27 for i:=1 to 8 do

28 begin

29 x1:=x+d[i,1];y1:=y+d[i,2];

30 if (x1>0) and (y1>0) and (x1<=n)

31 and (y1<=n) and (a[x1,y1]=0) then

32 begin

33 a[x1,y1]:=k;

34 if k=n*n then print

35 else try(x1,y1,k+1);

36 a[x1,y1]:=0;

37 end;

38 end;

39 end;

40

41 begin

42 clrscr;

43 write('x0,y0=');readln(x0,y0);

44 fillchar(a,sizeof(a),0);

45 total:=0;a[x0,y0]:=1;

46 try(x0,y0,2);

47 writeln('Total=',total);

48 writeln('Press any key to exit..。');

49 repeat until keypressed;

50 end.

自改C语言代码

运用了深度优先搜索算法。

可以输入一个起始位置的坐标后,列举出所有可能方案和方案个数。

也可以输出所有初始点方案的个数。

1 #include

2 #define N 5//格子行列数

3

4 int next[8][2]={{3,0},{-3,0},{0,3},{0,-3},{2,2},{2,-2},{-2,2},{-2,-2}};//下一步变换的位移

5 int x0,y0;//输入的初始坐标

6 int matrix[N][N];//存储nxn矩阵中的数字

7 int total;//方案数量

8

9 //打印一个矩阵的函数

10 void printMatrix(){

11 int i,j;

12 total+=1;//出来一次结果,就打印一次,方案数+1

13 printf("第%d种方案:\n",total);

14 for(i=0;i

15 for(j=0;j

16 printf("%d ",matrix[i][j]);

17 }

18 printf("\n");

19 }

20 printf("\n");

21 }

22 每个初始点都输出方案的个数的话就不把每个方案打印出来了,太占地方

23 //void printMatrix(){

24 // int i,j;

25 // total+=1;//出来一次结果,就打印一次,方案+1

26 //}

27

28 //主要函数,(x,y)是矩阵内坐标,k是第几个数字

29 void try(x,y,k){

30 int i,x1,y1;//x1,y1是本次要找的坐标

31 //将8个位移都试一遍

32 for(i=0;i<8;i++){

33 x1=x+next[i][0];

34 y1=y+next[i][1];

35 //如果该位置不超过边界且没有数字,则方案可行,把数字装进这个位置

36 if((x1>-1)&&(y1>-1)&&(x1

37 matrix[x1][y1]=k;

38 //如果k=25即已经搜索完,可以打印了

39 if(k==N*N)

40 printMatrix();

41 //如果还没到25,就继续搜索下一个位置

42 else

43 try(x1,y1,k+1);

44 //本次打印完/本次搜索尝试到死路,回溯到上一节点去往另一分支前,将这一节点清零

45 matrix[x1][y1]=0;

46 }

47 }

48 }

49

50

51 int main()

52 {

53 //输入坐标

54 printf("请输入第一个数的坐标(逗号间隔):");

55 scanf("%d,%d",&x0,&y0);

56

57 //矩阵整体清0(第一条在dev-c++可以跑,vc++不行,还是用老办法)

58 //memset(matrix, 0, sizeof(matrix));

59 int i,j;

60 for(i=0;i

61 for(j=0;j

62 matrix[i][j]=0;

63 }

64 }

65

66 //数据初始化,运行

67 total=0;//方案数为零

68 x0-=1;y0-=1;//用户输入坐标从1开始,c语言数组从0开始

69 matrix[x0][y0]=1;//第一个位置赋值1

70 try(x0,y0,2); //从数字2开始放置

71

72 printf("总共有%d种摆放方案\n\n",total);

73

74

75 // //每个初始点都输出方案的个数

76 // int m,n;

77 // for(m=0;m<5;m++){

78 // for(n=0;n<5;n++){

79 // x0=m;y0=n;

80 // //矩阵整体清0

81 // int i,j;

82 // for(i=0;i

83 // for(j=0;j

84 // matrix[i][j]=0;

85 // }

86 // }

87 // total=0;//每次节点前方案数清零

88 // matrix[x0][y0]=1;//第一个位置赋值1

89 // try(x0,y0,2); //从数字2开始放置

90 // printf("数字1被指定于(%d,%d)有%d种方案\n",m+1,n+1,total);

91 // }

92 // printf("\n");//每5行之后打个空行好看点

93 // }

94 }

结果

输入一个起始点坐标后输出的方案

3e413e0fef74c09d3857fdf4ffd01fa0.png

e7573702529dd3097fe8c15f33d600fe.png

输出所有起始点的方案个数:

b655eeb7d4866d0f251a01f67d3f6d10.png

标签:方案,x1,..,int,DFS,C语言,Pascal,y1,total

来源: https://www.cnblogs.com/threells1939/p/11735549.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值