李的算法 - 在表格中查找字符

时间:2016-05-21 18:34:02

标签: c# grid

我有问题找到网格中两个方格之间的最短路径。

我想实现Lee的算法,但我的目标是找到表中特定坐标的邻居。

当我用特定数字标记邻居时,我不太确定,在网格中移动光标的位置。我在网格中有四个移动,所以我每次都标记当前点的四个邻居,但是在哪里移动呢?

示例:

我的意见:

网格大小:MxN

表格中的字符。例如ABCDEF ...(它是一种键盘)

表格写的字符串:

例如:BCD

程序的输出将是写入此特定字符串的最小压力。 光标在网格中的起始位置位于左上角。按下的是:向上,向下,向左,向右和ENTER - 这将打印字符

我的开始方法是:首先找到表格中字符串字符的位置。然后制作一个带距离的矩阵,它在开始时到处都是零。然后检查找到的字符是否在左上角。如果是,则按下的次数为1,找到另一个字符。否则标记邻居并获取当前的字母。如果你到达当前字母,保存按下次数,并从前一个字符的位置找到下一个字符。

1 个答案:

答案 0 :(得分:0)

请参阅下面的按钮项目。阅读评论。您可以使用文本框来实现,这样您就可以将字母放入框中,或者可以将图片框添加到单元格中。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Buttons
{
    public partial class Form1 : Form
    {
        const int ROWS = 5;
        const int COLS = 10;

        public Form1()
        {
            InitializeComponent();
            this.Load += new System.EventHandler(this.Form1_Load);
        }
        public void Form1_Load(object sender, EventArgs e)
        {
            new MyButton(ROWS, COLS, this);
        }


    }
    public class MyButton : Button
    {
        const int WIDTH = 50;
        const int HEIGHT = 50;
        const int SPACE = 5;
        const int BORDER = 20;

        public static List<List<MyButton>> buttons { get; set; }
        public static List<MyButton> buttonList { get; set; }
        public Form1 form1;
        public int row { get; set; }
        public int col { get; set; }
        public Boolean[] neighbors { get; set; }  //array 0 to 3, 0 top, 1 right, 2 bottom, 3 left with false is no wall true is wall 
        public MyButton()
        {
        }
        public MyButton(int rows, int cols, Form1 form1)
        {
            buttons = new List<List<MyButton>>();
            buttonList = new List<MyButton>();

            this.form1 = form1;
            for (int row = 0; row < rows; row++)
            {
                List<MyButton> newRow = new List<MyButton>();
                buttons.Add(newRow);
                for (int col = 0; col < cols; col++)
                {
                    MyButton newButton = new MyButton();
                    newButton.Height = HEIGHT;
                    newButton.Width = WIDTH;
                    newButton.Top = row * (HEIGHT + SPACE) + BORDER;
                    newButton.Left = col * (WIDTH + SPACE) + BORDER;
                    newButton.row = row;
                    newButton.col = col;
                    newRow.Add(newButton);
                    buttonList.Add(newButton);
                    newButton.Click += new System.EventHandler(Button_Click);
                    form1.Controls.Add(newButton);
                }
            }
            neighbors = new Boolean[4];
            for (int i = 0; i < 0; i++)
            {
                neighbors[i] = true;
            }
        }
        public void Button_Click(object sender, EventArgs e)
        {
            MyButton button = sender as MyButton;
            MessageBox.Show(string.Format("Pressed Button Row {0} Column {1}", button.row, button.col));

        }

    }
}