【算法】矩阵填数,深度优先搜索(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][ ...
随机推荐
- 2019牛客多校D move——乱搞&&思维题
题意 给定 $n$ 个物品,体积分别为 $v_i$,现有 $K$ 的容积一样的箱子,按如下策略装入物品:每次选取尽可能大的装入(较大的不能装入时可以向小的找),依次装入箱子. 分析 首先,不具有严格的 ...
- sql server 游标的知识
一:认识游标 游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行.用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立 ...
- 053_修改 Linux 系统的最大打开文件数量
#!/bin/bash#往/etc/security/limits.conf 文件的末尾追加两行配置参数,修改最大打开文件数量为 65536 cat >> /etc/security/li ...
- PC端使用program來CHGUSRPRF
執行CHGUSRPRF命令需要*SECADM 權限,但通常Security部門不允許Grant這個這麼大的權限,爲了達到目的,改用下面的方法 1. Create CL program 注意裏面一定要用 ...
- 基本react-native模板
import React, { Component } from 'react'; import { Text } from 'react-native'; export default class ...
- codeforces#101194H. Great Cells(数学)
题目链接: https://codeforces.com/gym/101194 题意: 在$n×m$的各自中填上$1$到$k$的数 定义Greate cell为严格大于同行和同列的格子 定义$A_g$ ...
- codeforces gym #101987K -TV ShowGame(2-SAT)
题目链接: https://codeforces.com/gym/101987 题意: 有长度为$n$的只包含$B,R$的字符串 有m种关系,每个关系说出三个位置的确切字符 这三个位置的字符最多有一个 ...
- Gi命令行操作
一.本地库初始化 命令:git init 效果: 注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改 二.设置签名 形式 用户名:user Email 地址:user@1 ...
- Oracle导入数据时出错ORA-39143:转储文件可能是原始的转储文件
dmp文件是使用exp命令导出的,所以使用impdp导入则会报错误. 正确的导入语句为:imp sde/salis@orcl file='E:\sde.dmp' full=y;
- 【Phoenix】1、搭建 Phoenix 环境
Ps: 需要注意的是,我学习的时候,Elixir 是 1.8.1的版本,而 Phoenix 是 1.4.1的版本,对于其他版本,不一定正确. 1.安装 Phoenix 之前,先安装 Elixir. 2 ...