当前位置: 首页 > wzjs >正文

做企业网站专用词开发wap网站 转

做企业网站专用词,开发wap网站 转,网站后台乱码,如何做供求网站一.题目展示 二、代码解法 三、问题背景和目标 四、代码详细解释 一、题目展示 二、代码解法 #include <stdio.h> #include <stdlib.h>int zhuanyix[4]{1,0,-1,0}; int zhuanyiy[4]{0,1,0,-1}; int d[200]{0}; int j0; int num1;void dfs(int ab[][20],int a[]…

一.题目展示

二、代码解法

三、问题背景和目标

四、代码详细解释

一、题目展示

二、代码解法

#include <stdio.h>
#include <stdlib.h>int zhuanyix[4]={1,0,-1,0};
int zhuanyiy[4]={0,1,0,-1};
int d[200]={0};
int j=0;
int num=1;void dfs(int ab[][20],int a[][20],int b[],int c[],int x,int y,int n)
{//判断是否越界if(x<0 || x>=n || y<0 || y>=n){return ;}//判断是否已经走过if(ab[x][y]!=-1){return ;}//判断是否满足向北和西方射箭if(b[x]>0 && c[y]>0){ab[x][y]=j;b[x]--;c[y]--;d[j]=a[x][y];j++;//判断是否到终点了if(x==n-1&&y==n-1){for(int i=0;i<n;i++){if(b[i]==0 && c[i]==0){num++;}}if(num==n){for(int i=0;i<j;i++){printf("%d ",d[i]);}return ;}num=0;
}
for(int i=0;i<4;i++)
{dfs(ab,a,b,c,x+zhuanyix[i],y+zhuanyiy[i],n);
}ab[x][y]=-1;b[x]++;c[y]++;j--;
}
}int main()
{int n;int b[20],c[20];scanf("%d",&n);int a[20][20];int ab[20][20];//棋盘初始化for(int i=0;i<n;i++){for(int j=0;j<n;j++){ab[i][j]=-1;}}for(int i=0;i<n;i++){for(int j=0;j<n;j++){a[i][j]=i*n+j;}}for(int i=0;i<n;i++){scanf("%d",&c[i]);}for(int i=0;i<n;i++){scanf("%d",&b[i]);}dfs(ab,a,b,c,0,0,n);return 0;
}

三、问题背景和目标

这个题目考察的是DFS(深度优先搜索)算法,代码用了回溯的解法,先看代码,我们要想象有一个n*n的棋盘,每一行和每一列都要有一定数量的箭,我们要从棋盘左上角(0,0)出发,走到右下角(n-1,n-1)。在走过每一个格子时,要分别向这一行和这一列各射一箭(前提是这每一行每一列还有箭,当走到终点时,每一行每一列的箭刚好用完,就说明走的是一个有效的路径,最后代码就会输出这个路径。

四、代码详细解释

1.全局变量定义

int zhuanyix[4]={1,0,-1,0};
int zhuanyiy[4]={0,1,0,-1};
int d[200]={0};
int j=0;
int num=1;

zhuanyix和zhuanyiy:这两个数组表示四个方向的偏移量zhuanyix[0]=1和zhuanyiy[0]=0表示向右移动zhuanyix[1] = 0 和 zhuanyiy[1] = 1 表示向下移动;zhuanyix[2] = -1 和 zhuanyiy[2] = 0 表示向左移动;zhuanyix[3] = 0 和 zhuanyiy[3] = -1 表示向上移动。

d数组:用于存储路径,每个元素存储路径上经过的格子的编号。

j:d数组的索引,记录当前路径的长度。

num:用于统计到达终点时,箭用完的行和列的数量。

2. dfs 函数(深度优先搜索函数

void dfs(int ab[][20], int a[][20], int b[], int c[], int x, int y, int n) {// 判断是否越界if (x < 0 || x >= n || y < 0 || y >= n) {return;}// 判断是否已经走过if (ab[x][y] != -1) {return;}// 判断是否满足向北和向西射箭的条件if (b[x] > 0 && c[y] > 0) {ab[x][y] = j;b[x]--;c[y]--;d[j] = a[x][y];j++;// 判断是否到达终点if (x == n - 1 && y == n - 1) {for (int i = 0; i < n; i++) {if (b[i] == 0 && c[i] == 0) {num++;}}if (num == n) {for (int i = 0; i < j; i++) {printf("%d ", d[i]);}return;}num = 0;}for (int i = 0; i < 4; i++) {dfs(ab, a, b, c, x + zhuanyix[i], y + zhuanyiy[i], n);}ab[x][y] = -1;b[x]++;c[y]++;j--;}
}

边界检查

if (x < 0 || x >= n || y < 0 || y >= n):如果当前位置 (x, y) 超出了棋盘的边界,函数直接返回,停止继续搜索。

if (ab[x][y] != -1):如果当前位置已经被访问过(ab[x][y] 不等于 -1),函数直接返回,避免重复访问。

射箭条件检查

if (b[x] > 0 && c[y] > 0):如果当前位置所在行和列都还有箭,那么可以继续前进。

ab[x][y] = j:标记当前位置已经被访问,并记录访问顺序。

b[x]-- 和 c[y]--:消耗当前位置所在行和列的各一支箭。

d[j] = a[x][y]:将当前格子的编号存入路径数组 d 中。

j++:路径长度加 1。

终点检查

if (x == n - 1 && y == n - 1):如果到达了右下角的终点,检查所有行和列的箭是否都被用完。

for (int i = 0; i < n; i++):遍历每一行和每一列,统计箭用完的数量。

if (num == n):如果所有行和列的箭都被用完,输出路径

num = 0:重置 num 变量,为下一次搜索做准备

递归搜索

for (int i = 0; i < 4; i++):从当前位置向四个方向进行递归搜索。

dfs(ab, a, b, c, x + zhuanyix[i], y + zhuanyiy[i], n):递归调用 dfs 函数,继续搜索下一个位置。

回溯操作

ab[x][y] = -1:将当前位置标记为未访问

b[x]++ 和 c[y]++:归还当前位置所在行和列的箭

j--:路径长度减 1。

3.主函数

int main() {int n;int b[20], c[20];scanf("%d", &n);int a[20][20];int ab[20][20];// 初始化棋盘for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {ab[i][j] = -1;}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {a[i][j] = i * n + j;}}for (int i = 0; i < n; i++) {scanf("%d", &c[i]);}for (int i = 0; i < n; i++) {scanf("%d", &b[i]);}dfs(ab, a, b, c, 0, 0, n);return 0;
}
读取输入

scanf("%d", &n):读取棋盘的大小 n

scanf("%d", &c[i]) 和 scanf("%d", &b[i]):分别读取每一列和每一行的箭的数量。

棋盘初始化

ab[i][j] = -1:将 ab 数组初始化为 -1,表示所有位置都未被访问。

a[i][j] = i * n + j:为每个格子分配一个唯一的编号。

举个例子:

假设棋盘大小 n=3 ,那么棋盘的样子可以表示为

列 0列 1列 2
行 0a[0][0]a[0][1]a[0][2]
行 1a[1][0]a[1][1]a[1][2]
行 2a[2][0]a[2][1]a[2][2]

对于 a[0][0] :此时 i = 0 ,j = 0 ,代入 i * n + j 可得 0 * 3 + 0 = 0 ,所以 a[0][0] 的编号是 0 。

对于 a[0][1] :i = 0 ,j = 1 ,计算 0 * 3 + 1 = 1 ,其编号是 1 。

对于 a[1][0] :i = 1 ,j = 0 ,1 * 3 + 0 = 3 ,编号为 3 。

对于 a[2][2] :i = 2 ,j = 2 ,2 * 3 + 2 = 8 ,编号是 8 。

完整的棋盘格子编号如下:

列 0列 1列 2
行 0012
行 1345
行 2678

这样通过 i * n + j 就为棋盘上的每个格子都赋予了一个独特的编号,方便在后续代码中对格子进行标识和处理,比如在记录路径时(d[j] = a[x][y]; 这行代码中,就是将格子编号记录到路径数组 d 中 ) 。

调用 dfs 函数

dfs(ab, a, b, c, 0, 0, n):从左上角 (0, 0) 开始进行深度优先搜索。

简单例子

假设 n = 2,每一列的箭数 c 为 [1, 1],每一行的箭数 b 为 [1, 1]。棋盘如下:

| 0  1 |
| 2  3 |
  • 从 (0, 0) 位置开始,b[0] = 1c[0] = 1,满足射箭条件,消耗箭,标记位置,记录路径。
  • 向右移动到 (0, 1)b[0] = 0c[1] = 1,满足射箭条件,消耗箭,标记位置,记录路径。
  • 向下移动到 (1, 1),到达终点,检查发现所有行和列的箭都被用完,输出路径 0 1 3
http://www.dtcms.com/wzjs/534981.html

相关文章:

  • 仙居网站建设贴吧中国化工建设网站
  • 网站建设优化的书籍模板建站seo优化
  • 网站推广的方法ppt深圳营销型网站制作
  • 洛阳霞光建设网站seo手机端排名软件
  • 建立一个企业网站司局网站维护廉政风险建设
  • 如何推广自己的网站建设网站流程
  • 招聘网站建设费用多少凡科怎么建设网站
  • 饶平网站建设公司高端品牌发布会
  • 徐州网站客户做婚礼设计在哪个网站下载素材
  • 网易网站开发语言直播网站建设开发
  • 现在还有企业做网站的吗哪些国家网站无须备案
  • 禅城建设网站做公众号微网站
  • 电商网站建设收费网站优化的主要目的是什么
  • 做的好的商城网站设计怎么在天猫注册开店铺
  • 贡井移动网站建设湖北省网站备案最快几天
  • 招聘网58同城招聘发布新手怎么做seo
  • 聊城做网站建设网页设计项目模板代码
  • 商城网站的管理用户模块网站建设自查及整改报告
  • 赣州做网站多少钱企业品牌vi设计
  • 山西响应式网站设计桂林学校网站制作
  • 网站实名认证要钱吗做外贸推广的平台
  • 石材公司网站北京网站sem、seo
  • 网站运营与管理的目的是搜索指数在线查询
  • 医疗网站整站优化思路出口企业网站建设
  • 外贸自主建站平台做物流的都有哪些网站
  • 网站小功能优秀平面设计作品网站
  • 湖州网站设计公司的别名是wordpress文章商品模板
  • 莆田网站开发公司wordpress链接调用
  • 做网站怎么赚钱 知乎黄埔网站开发公司
  • 聊城网站建设售后服务旅游网站界面设计