【算法】矩阵填数,深度优先搜索(DFS),Pascal改C语言
面向对象的上机实验
题目
以下列方式向 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语言的更多相关文章
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- 【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...
- 深度优先搜索 DFS 学习笔记
深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- [FJOI2017]矩阵填数——容斥
参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...
- P3813 [FJOI2017]矩阵填数(组合数学)
P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...
- bzoj5010: [Fjoi2017]矩阵填数
Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...
- [BZOJ5010][FJOI2017]矩阵填数(状压DP)
5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 90 Solved: 45[Submit][Status][ ...
随机推荐
- BZOJ 3901 棋盘游戏 (找结论+枚举+贪心)
题面 略 BZOJ 传送门 分析 具体分析见 dalao博客 妙就妙在当i<x,j<xi<x,j<xi<x,j<x时,(i,j)(i,j)(i,j) ^ (i,x) ...
- 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 ...
- Python操作MySQL数据库,插入重复数据
sql = "INSERT INTO test_c(id,name,sex)values(%s,%s,%s)" param = (1,'AJ','MAN') n = cursor ...
- Guardian of Decency POJ - 2771 【二分匹配,最大独立集】
Problem DescriptionFrank N. Stein is a very conservative high-school teacher. He wants to take some ...
- 041_查找 Linux 系统中的僵尸进程
#!/bin/bash#awk 判断 ps 命令输出的第 8 列为 Z 是僵尸进程,显示该进程的 PID 和进程命令 ps aux |awk '{if($8 == "Z"){pri ...
- BigDecimal 3个toString()方法区别
BigDecimal 的toEngineeringString.toPlainString和toString方法的区别: toEngineeringString:有必要时使用工程计数法.工程记数法是一 ...
- 删数问题(SDUT2072 )
删数问题 Time Limit: 1000 msMemory Limit: 65536 KiB Problem Description 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字 ...
- 2019.7.9 校内测试 T2 极值问题
这一次是交流测试?边交流边测试(滑稽 极值问题 乍一看这是一道数学题,因为1e9的数据让我暴力的心退却. 数学又不好,不会化简式子嘞,咋办? 不怕,咱会打表找规律.(考场上真的是打表找出了规律,打表打 ...
- JVM——垃圾回收
目录: 如何判断垃圾是否回收? 引用计数法 可达性分析算法 四种引用 引用队列 垃圾回收算法 标记清除算法 复制算法 标记整理算法 分代垃圾回收 新生代 老年代 Minor GC 和 Full GC的 ...
- Leetcode题目322.零钱兑换(动态规划-中等)
题目描述: 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...