今天我参加的有道难题编程大赛看到的题目,分享我的算法给大家:
话说你在走路上班时,经过一片种植萝卜的农田。这块田地的形状是一个矩形的网格。 field的第i个元素的第j个字符,表示田地的第i行第j列的格子里包含的萝卜的数目。 我们定义一个格子的特殊程度为它周围所有格子的萝卜个数的和; 它周围的格子包含它上下左右以及对角相邻的格子, 最多有8个,在田地的边界上的格子会少一些。如果一个格子周围没有别的格子,则它的特殊程度为0。 请返回田地中特殊程度在A和B之间的所有格子的数目(包含A,B)。
Definition
Class: NumberField
Method: countSpecialNumbers
Parameters: string[], int, int
Returns: int
Method signature: int countSpecialNumbers(string[] field, int A, int B) (be sure your method is public) Constraints
我的实现方法如下: C#
using System;
using System.Collections.Generic;
using System.Text;
namespace Field
{
/// <summary>
/// 2009.6.1 with ann by hooyes
/// </summary>
public class NumberField
{
static void Main(string[] args)
{
//Test .
string[] fieldx ={
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890",
"1234567890"};
int r = countSpecialNumbers(fieldx, 3, 18);
Console.WriteLine(r);
Console.Read();
}
/// <summary>
/// 获取第i,j格的萝卜数
/// </summary>
/// <param name="i">行</param>
/// <param name="j">列</param>
/// <param name="fieldx"></param>
/// <returns></returns>
public static int fij(int i, int j,string[] fieldx)
{
int Rvalue = 0;
if (i < 0 || j < 0)
{
return 0;
}
int y = fieldx.Length - 1; //行
int x = fieldx[0].Length - 1; //列
if ((i > y) || (j > x))
{
return 0;
}
string f = fieldx[i];
byte[] hooyesBy = System.Text.Encoding.ASCII.GetBytes(f);
char xB = (char)hooyesBy[j];
Rvalue = int.Parse(xB.ToString());
return Rvalue;
}
/// <summary>
/// 获取第i,j格的特殊度
/// </summary>
/// <param name="i">行</param>
/// <param name="j">列</param>
/// <param name="fieldx"></param>
/// <returns></returns>
public static int fsp(int i, int j, string[] fieldx)
{
int Rvalue = 0;
Rvalue = fij(i - 1, j, fieldx) + fij(i + 1, j, fieldx) + fij(i, j - 1, fieldx) + fij(i, j+1, fieldx) + fij(i - 1, j - 1, fieldx) + fij(i + 1, j + 1, fieldx) + fij(i - 1, j + 1, fieldx) + fij(i + 1, j - 1, fieldx);
return Rvalue;
}
/// <summary>
/// 返回满足特殊度在A至B之间的格子数
/// </summary>
/// <param name="field"></param>
/// <param name="A">特殊度下限</param>
/// <param name="B">特殊度上限</param>
/// <returns></returns>
public static int countSpecialNumbers(string[] field, int A, int B)
{
int Rvalue = 0;
//int i=0;
//int j=0;
int y = field.Length-1; //行
int x = field[0].Length-1 ; //列
for (int i = 0; i <=y; i++)
{
for (int j = 0; j <=x;j++)
{
int tInt = fsp(i, j, field);
if (tInt >= A && tInt <= B)
{
Rvalue++;
}
}
}
return Rvalue;
}
}
}
Windows 服务器中使用netsh命令行配置端口转发很简单。
以下操作需要在管理员权限下的命令行窗口执行。
假设我们的服务器IP为104.198.14.52 需要把3100端口转发到另外一台服务器172.217.160.69的 3307 端口
netsh interface portproxy add v4tov4 listenaddress=104.198.14.52 listenport=3100 connectaddress=172.217.160.69 connectport=3307
netsh interface portproxy delete v4tov4 listenport=3100 listenaddress=104.198.14.52
netsh interface portproxy show all
注:IP地址可以是内网地址,也可是公网地址,支持IPv4 与 IPv6 , 关于 v4tov4 参数的解释
v4tov4 - IPv4 代理连接到另一个 IPv4 端口的参数
v4tov6 - IPv4 代理连接到 IPv6 的参数
v6tov4 - IPv6 代理连接到 IPv4 的参数
v6tov6 - IPv6 代理连接到另一个 IPv6 端口的参数
rinetd 快速配置实现端口转发,它配置简单方便。
我们通常都认为,简单的东西往往是好东西。
以下以CentOS 为例,其它Linux操作系统,请相应该修改命令。
2020年1月13日 更新:
boutell.com 已不再是rinetd的官网,作者已把代码开源到Github上, 请从作者Github下载源码
https://github.com/boutell/rinetd
或者从我Fork的版本
https://github.com/hooyes/rinetd
在CentOS输入下面的命令,一行一个:
#安装依赖
yum -y install gcc gcc-c++
#下载rinetd
wget https://boutell.com/rinetd/http/rinetd.tar.gz (下载地址已失效,请从github下载 )
#解压
tar -zxvf rinetd.tar.gz
#创建手册目录
mkdir -p /usr/man/man8
#进入目录
cd rinetd
#编译安装
make && make install
#编译成功后,请输入rinetd -v 查看当前版本