NPU17届程序设计作业5 求图像周长

描述:

给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。

输入:

首先给出m、n、x、y四个正整数,下面给出m×n的图形,x、y表示点击的位置,全0表示结束。

输出:

点击的图形的周长。

输入样例:

2 2 2 2 XX XX 6 4 2 3 .XXX .XXX .XXX ...X ..X. X... 0 0 0 0

输出样例:

8 18

本题可以使用较为简便的方法,创建一个二维数组容纳输入的图像数据,用另一个二维数组进行标记。然后从给定的坐标处向外拓展,由于影响周长的只有上下左右四个方向是否有有效图像,因此可以直接用If语句判断。观察后可以发现,一个为“X"的有效坐标,只有其上下左右四个方向是边界或是“."的空位置坐标,该方向的周长才会被计算,因此只需判断这些方向是否超出了给定的大小限制或是否为”."即可实现目的。

#include<iostream>
using namespace std;

char map[20][20];//创建一个地图 
int mapflag[20][20];//将已经计算过的坐标标记以防止重复计算 
int crow,ccol;
int row,col;
int length=0;//计数器 

void search(int y,int x);
void judge(int y,int x);
void returnorigin();

int main()
{
	while (1)
	{
		int y,x;
		cin>>row>>col>>crow>>ccol;
		if (row==0 && col==0 && crow==0 && ccol==0)
		{//输入4个0结束程序 
			break;
		}
		for (y=0;y<row;y++)
		{
			for (x=0;x<col;x++)
			{//输入地图 
				cin>>map[y][x];
			}
		}
		search(crow-1,ccol-1);
		cout<<length<<endl;
		returnorigin();
	}
}

void search(int y,int x)
{
	if (map[y][x]=='X' && mapflag[y][x]!=1)
	{//只有未被标记和在地图上为"X"的坐标才能进入 
		int m,n;
		judge(y,x);
		mapflag[y][x]=1;//将已经判断过的坐标标记 
		for (m=-1;m<2;m++) 
		{//对当前坐标周围的8个坐标进行判断 
			for (n=-1;n<2;n++)
			{
				if (m==0 && n==0)
				{
					continue;
				}
				else
				{ 
					search(y+m,x+n);
				}
			}
		}
	}
}

void judge(int y,int x)
{//判断当前坐标可以记录的周长 
	if (map[y][x-1]=='.' && x-1>=0)
	{
		length=length+1;
	}
	if (map[y][x+1]=='.' && x+1<col)
	{
		length=length+1;
	}
	if (map[y-1][x]=='.' && y-1>=0)
	{
		length=length+1;
	}
	if (map[y+1][x]=='.' && y+1<row)
	{
		length=length+1;
	}
	if (y-1<0)
	{
		length=length+1;
	}
	if (y+1==row)
	{
		length++;
	}
	if (x-1<0)
	{
		length++;
	}
	if (x+1==col)
	{
		length++;
	}
}

void returnorigin()
{//将全局变量恢复以进行下次计算 
	int y,x;
	crow=0;
	ccol=0;
	length=0;
	for (y=0;y<row;y++)
	{
		for (x=0;x<col;x++)
		{
			map[y][x]=0;
			mapflag[y][x]=0;
		}
	}
}
由于NOJ的输入和输出不在同一个文件内,本代码并不具备输入多组数据后再输入0 0 0 0才输出周长的功能,若想实现该功能,可以将main函数的while语句更换为for语句,将length变量改为数组,并在程序末尾输出数组结果即可。


在JavaScript中,创建网格图并计算从左上角到右下角的最小和通常涉及到动态规划或者深度优先搜索(DFS)。网格图通常是一个二维数组,每个元素代表一个格子的值。为了找到从左上角到右下角的路径,我们需要遍历每一个节点,并考虑当前节点加上相邻节点的值(如果有权限走那条路)。 假设我们有一个二维数组grid,其中每个元素grid[i][j]表示位置(i, j)的值,我们可以用以下步骤实现: 1. 初始化两个变量:startSum存储左上角的值,minPathSum初始设为无穷大。 2. 定义一个函数dfs(grid, i, j, startSum),用于递归地查找路径和: - 如果i和j越界,返回0; - 如果当前位置等于起点,直接返回startSum; - 否则,尝试向四个方向(上、下、左、右)移动,更新pathSum为当前位置值加上对应方向邻居的dfs结果,然后取最小值。 ```javascript function minPathSum(grid, startRow, startCol) { const rows = grid.length; const cols = grid[0].length; let dp = Array.from({ length: rows }, () => Array(cols).fill(Infinity)); dp[startRow][startCol] = grid[startRow][startCol]; for (let i = 1; i < rows; i++) { dp[i][startCol] = dp[i - 1][startCol] + grid[i][startCol]; } for (let j = 1; j < cols; j++) { dp[startRow][j] = dp[startRow][j - 1] + grid[startRow][j]; } for (let i = 1; i < rows; i++) { for (let j = 1; j < cols; j++) { dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]; } } return dp[rows - 1][cols - 1]; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值