面向对象的上机实验

题目

以下列方式向 5*5 矩阵中填入数字。设数字i(1=<i<=25),则数字i+1 的坐标位置应为(E, W)。(E, W)可根据下列关系由(x,y)算出:

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

 Program lx9__;
uses crt;
const n=;
d:array[..,..] of shortint=((,),(-,),(,),(,-),
(,),(,-),(-,),(-,-));
var x0,y0:byte;
a:array[..n,..n] of byte;
total:longint; procedure print;
var i,j:integer;
begin
inc(total);
gotoxy(,);
writeln('[',total,']');
for i:= to n do
begin
for j:= to n do
write(a[i,j]:);
writeln;
end;
end; procedure try(x,y,k:byte);
var i,x1,y1:integer;
begin
for i:= to do
begin
x1:=x+d[i,];y1:=y+d[i,];
if (x1>) and (y1>) and (x1<=n)
and (y1<=n) and (a[x1,y1]=) then
begin
a[x1,y1]:=k;
if k=n*n then print
else try(x1,y1,k+);
a[x1,y1]:=;
end;
end;
end; begin
clrscr;
write('x0,y0=');readln(x0,y0);
fillchar(a,sizeof(a),);
total:=;a[x0,y0]:=;
try(x0,y0,);
writeln('Total=',total);
writeln('Press any key to exit..。');
repeat until keypressed;
end.

自改C语言代码

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

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

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

 #include <stdio.h>
#define N 5//格子行列数 int next[][]={{,},{-,},{,},{,-},{,},{,-},{-,},{-,-}};//下一步变换的位移
int x0,y0;//输入的初始坐标
int matrix[N][N];//存储nxn矩阵中的数字
int total;//方案数量 //打印一个矩阵的函数
void printMatrix(){
int i,j;
total+=;//出来一次结果,就打印一次,方案数+1
printf("第%d种方案:\n",total);
for(i=;i<N;i++){
for(j=;j<N;j++){
printf("%4d",matrix[i][j]);//%4d表示输出宽度为4,且右对齐
}
printf("\n");
}
printf("\n");
}
////每个初始点都输出方案的个数的话就不把每个方案打印出来了,太占地方
//void printMatrix(){
// int i,j;
// total+=1;//出来一次结果,就打印一次,方案+1
//} //主要函数,(x,y)是矩阵内坐标,k是第几个数字
void try(x,y,k){
int i,x1,y1;//x1,y1是本次要找的坐标
//将8个位移都试一遍
for(i=;i<;i++){
x1=x+next[i][];
y1=y+next[i][];
//如果该位置不超过边界且没有数字,则方案可行,把数字装进这个位置
if((x1>-)&&(y1>-)&&(x1<N)&&(y1<N)&&(matrix[x1][y1]==)){
matrix[x1][y1]=k;
//如果k=25即已经搜索完,可以打印了
if(k==N*N)
printMatrix();
//如果还没到25,就继续搜索下一个位置
else
try(x1,y1,k+);
//本次打印完/本次搜索尝试到死路,回溯到上一节点去往另一分支前,将这一节点清零
matrix[x1][y1]=;
}
}
} int main()
{
//输入坐标
printf("请输入第一个数的坐标(逗号间隔):");
scanf("%d,%d",&x0,&y0); //矩阵整体清0(第一条在dev-c++可以跑,vc++不行,还是用老办法)
//memset(matrix, 0, sizeof(matrix));
int i,j;
for(i=;i<N;i++){
for(j=;j<N;j++){
matrix[i][j]=;
}
} //数据初始化,运行
total=;//方案数为零
x0-=;y0-=;//用户输入坐标从1开始,c语言数组从0开始
matrix[x0][y0]=;//第一个位置赋值1
try(x0,y0,); //从数字2开始放置 printf("总共有%d种摆放方案\n\n",total); // //每个初始点都输出方案的个数
// int m,n;
// for(m=0;m<5;m++){
// for(n=0;n<5;n++){
// x0=m;y0=n;
// //矩阵整体清0
// int i,j;
// for(i=0;i<N;i++){
// for(j=0;j<N;j++){
// matrix[i][j]=0;
// }
// }
// total=0;//每次节点前方案数清零
// matrix[x0][y0]=1;//第一个位置赋值1
// try(x0,y0,2); //从数字2开始放置
// printf("数字1被指定于(%d,%d)有%d种方案\n",m+1,n+1,total);
// }
// printf("\n");//每5行之后打个空行好看点
// }
}

结果

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

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

【算法】矩阵填数,深度优先搜索(DFS),Pascal改C语言的更多相关文章

  1. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

  2. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...

  3. 深度优先搜索 DFS 学习笔记

    深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...

  4. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  5. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  6. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  7. [FJOI2017]矩阵填数——容斥

    参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...

  8. P3813 [FJOI2017]矩阵填数(组合数学)

    P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...

  9. bzoj5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  10. [BZOJ5010][FJOI2017]矩阵填数(状压DP)

    5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 45[Submit][Status][ ...

随机推荐

  1. jmeter接口测试-使用aes加密算法

    好久没写文章了,一直在忙公司项目的事情!今天抽空写篇关于jmeter加密的教程吧! 随着互联网的发展,越来越多的系统开始提供接口调用! 我们进行接口测试的时候,大多数接口或多或少的都使用了各种加密验证 ...

  2. 6-修改虚拟机的SID(sysprep)

    一.注意点 1.这种错误一般会出现在克隆的机器里,导致在加入域的时候,报SID一致,加入失败,如下图: 2.使用sysprep修改完之后,需要重启服务器,并且重新配置,重新配网络: 3.如果修改SID ...

  3. ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意:定义一个长度为 n 的序列 a1,a2,..,an ...

  4. Codeforces Round #585 (Div. 2) C. Swap Letters

    链接: https://codeforces.com/contest/1215/problem/C 题意: Monocarp has got two strings s and t having eq ...

  5. VSCode:使用GIT

    准备:安装GIT.安装VSCode.GitHub上添加 1.初始化 新建本地文件xmai # 全局配置加上命令--global ,如果只想在本文件夹则去掉此参数即可: > git init &g ...

  6. CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)

    思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上 ...

  7. js 获取窗口大小

     //获得窗口大小         function findDimensions() //函数:获取尺寸         {             var point = {};          ...

  8. Appium自动化测试教程-自学网-Package与Activity

    Package Package 包.只是在我们的app中这个Package是唯一的,就像你身份证号码一样.在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道 ...

  9. P5358 [SDOI2019]快速查询

    思路:...乱搞数据结构?? 提交:1次 题解: 观察到除了单点就是全局操作,所以我们维护一个全局加法标记add和乘法标记mul和答案sum. 单点修改时,比如我们要把 \(pos\) 位置改成 \( ...

  10. STL练习板子题(c++11警告)

    第一题 词典 总时间限制: 3000ms 内存限制: 65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一个词典, ...