1. 程式人生 > >判斷矩陣元素相連——CSharp陣列

判斷矩陣元素相連——CSharp陣列

題目如下:

題目是這樣的,判斷一個圖是不是連通圖。

一個矩陣裡邊只有0和1組成。如果矩陣裡,1周圍的8個位置,還有1,那麼這2個1就算聯通的。
如果這個圖裡所有的1都能互相聯通那麼,就這個矩陣就是聯通的,否則就是不聯通的。

用演算法判斷一個矩陣是不是聯通的。

程式碼如下:

    class Matrix
    {

        public int[,] createMatrix(int m, int n)
        {
            Random rd = new Random();
            int[,] matrix = new int[m, n];
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    matrix[i, j] = rd.Next(0, 2);
                }
            }
            return matrix;
        }

        public List<int[]> searchElementsOut(int[,] matrix)
        {
            List<int[]> elements = new List<int[]>();
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    if (matrix[i, j] == 1)
                    {
                        int[] ele = new int[2];
                        ele[0] = i;
                        ele[1] = j;
                        elements.Add(ele);
                    }
                }
            }
            return elements;
        }

        public List<int[]> searchElementLink(int[,] matrix, int Em, int En)
        {
            List<int[]> elements = new List<int[]>();
            if (Em == 0 && En == 0)
            {
                if (matrix[Em + 1, En] == 1)
                {
                    int[] temp = { Em + 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em, En + 1] == 1)
                {
                    int[] temp = { Em, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En + 1] == 1)
                {
                    int[] temp = { Em + 1, En + 1 };
                    elements.Add(temp);
                }
            }
            else if (Em == 0 && En > 0 && En < matrix.GetLength(1) - 1)
            {
                if (matrix[Em, En - 1] == 1)
                {
                    int[] temp = { Em, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En + 1] == 1)
                {
                    int[] temp = { Em, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En - 1] == 1)
                {
                    int[] temp = { Em + 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En] == 1)
                {
                    int[] temp = { Em + 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En + 1] == 1)
                {
                    int[] temp = { Em + 1, En + 1 };
                    elements.Add(temp);
                }
            }
            else if (Em == 0 && En == matrix.GetLength(1) - 1)
            {
                if (matrix[Em, En - 1] == 1)
                {
                    int[] temp = { Em, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En - 1] == 1)
                {
                    int[] temp = { Em + 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En] == 1)
                {
                    int[] temp = { Em + 1, En };
                    elements.Add(temp);
                }
            }
            else if (Em > 0 && Em < matrix.GetLength(0) - 1 && En == 0)
            {
                if (matrix[Em - 1, En] == 1)
                {
                    int[] temp = { Em - 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En + 1] == 1)
                {
                    int[] temp = { Em - 1, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En + 1] == 1)
                {
                    int[] temp = { Em, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En] == 1)
                {
                    int[] temp = { Em + 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En + 1] == 1)
                {
                    int[] temp = { Em + 1, En + 1 };
                    elements.Add(temp);
                }
            }
            else if (Em > 0 && Em < matrix.GetLength(0) - 1 && En == matrix.GetLength(1) - 1)
            {
                if (matrix[Em - 1, En - 1] == 1)
                {
                    int[] temp = { Em - 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En] == 1)
                {
                    int[] temp = { Em - 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em, En - 1] == 1)
                {
                    int[] temp = { Em, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En - 1] == 1)
                {
                    int[] temp = { Em + 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En] == 1)
                {
                    int[] temp = { Em + 1, En };
                    elements.Add(temp);
                }
            }
            else if (Em == matrix.GetLength(0) - 1 && En == 0)
            {
                if (matrix[Em - 1, En] == 1)
                {
                    int[] temp = { Em - 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En + 1] == 1)
                {
                    int[] temp = { Em - 1, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En + 1] == 1)
                {
                    int[] temp = { Em, En + 1 };
                    elements.Add(temp);
                }
            }
            else if (Em == matrix.GetLength(0) - 1 && En > 0 && En < matrix.GetLength(1) - 1)
            {
                if (matrix[Em - 1, En - 1] == 1)
                {
                    int[] temp = { Em - 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En] == 1)
                {
                    int[] temp = { Em - 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En + 1] == 1)
                {
                    int[] temp = { Em - 1, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En - 1] == 1)
                {
                    int[] temp = { Em, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En + 1] == 1)
                {
                    int[] temp = { Em, En + 1 };
                    elements.Add(temp);
                }
            }
            else if (Em == matrix.GetLength(0) - 1 && En == matrix.GetLength(1) - 1)
            {
                if (matrix[Em - 1, En - 1] == 1)
                {
                    int[] temp = { Em - 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En] == 1)
                {
                    int[] temp = { Em - 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em, En - 1] == 1)
                {
                    int[] temp = { Em, En - 1 };
                    elements.Add(temp);
                }
            }
            else if (Em > 0 && Em < matrix.GetLength(0) - 1 && En > 0 && En < matrix.GetLength(1) - 1)
            {
                if (matrix[Em - 1, En - 1] == 1)
                {
                    int[] temp = { Em - 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En] == 1)
                {
                    int[] temp = { Em - 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em - 1, En + 1] == 1)
                {
                    int[] temp = { Em - 1, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En - 1] == 1)
                {
                    int[] temp = { Em, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em, En + 1] == 1)
                {
                    int[] temp = { Em, En + 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En - 1] == 1)
                {
                    int[] temp = { Em + 1, En - 1 };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En] == 1)
                {
                    int[] temp = { Em + 1, En };
                    elements.Add(temp);
                }
                if (matrix[Em + 1, En + 1] == 1)
                {
                    int[] temp = { Em + 1, En + 1 };
                    elements.Add(temp);
                }
            }
            return elements;
        }

        public void searchElementsLink(int[,] matrix, int Em, int En, ref List<int[]> elementsPeri, ref List<int[]> elements)
        {
            List<int[]> elementsPeriT = new List<int[]>();
            List<int[]> elementsPeriTs = new List<int[]>();
            List<int[]> elementsPeriTt = new List<int[]>();
            if (elementsPeri.Count != 0)
            {
                foreach (int[] per in elementsPeri)
                {
                    if (!isContains(elements, per))
                    {
                        elements.Add(per);
                    }
                    elementsPeriTt = searchElementLink(matrix, per[0], per[1]);
                    elementsPeriTs.AddRange(elementsPeriTt);
                }
            }
            if (elementsPeriTs.Count != 0)
            {
                foreach (int[] per in elementsPeriTs)
                {
                    if (!isContains(elements, per))
                    {
                        elementsPeriT.Add(per);
                    }
                }
            }
            elementsPeri = elementsPeriT;
        }

        public bool isContains(List<int[]> list, int[] tmp)
        {
            bool result = false;
            foreach (int[] l in list)
            {
                if (l[0] == tmp[0] && l[1] == tmp[1])
                {
                    result = true; break;
                }
            }
            return result;
        }

        public bool isLink(int[,] matrix, int Em1, int En1, int Em2, int En2)
        {
            bool islink = false;
            List<int[]> elements = new List<int[]>();
            List<int[]> element1 = searchElementLink(matrix, Em1, En1);
            while (element1.Count != 0)
            {
                searchElementsLink(matrix, Em1, En1, ref element1, ref elements);
            }
            int[] E2 = { Em2, En2 };
            if (isContains(elements, E2))
            {
                islink = true;
            }
            return islink;
        }

        public void dowork(int m, int n)
        {
            Console.WriteLine("隨機陣列如下:");
            int[,] matrix = createMatrix(m, n);
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    Console.Write(matrix[i, j].ToString() + "  ");
                }
                Console.WriteLine();
            }

            List<int[]> elementsout = new List<int[]>();
            elementsout = searchElementsOut(matrix);

            int[] ele = new int[2];
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (matrix[i, j] == 1)
                    {
                        ele[0] = i;
                        ele[1] = j; break;
                    }
                }
            }

            bool islink = true;
            foreach (int[] e in elementsout)
            {
                if (!isLink(matrix, e[0], e[1], ele[0], ele[1]))
                {
                    islink = false; break;
                }
            }

            Console.WriteLine(islink.ToString());


        }

    }

        static void Main(string[] args)
        {
            Matrix mat = new Matrix();
            mat.dowork(15, 15);
            Console.ReadKey();
        }

簡單解釋一下程式碼。

createMatrix(m,n)是建立一個m行n列矩陣模型陣列;

searchElementsOut(matrix)是搜尋出矩陣中的所有的為1的元素;

searchElementLink(matrix,Em,En)是搜尋出元素matrix[Em,En]周邊為1的元素;

searchElementsLink(matrix,Em,En,ref elementsPeri,elements)在matrix矩陣中搜索與元素matrix[Em,En]所有相關聯的元素;

isContains(list,tmp)判斷陣列集list是否包含陣列;

dowork(m,n)方法體;

結果如下:


當m值和n值偏大的情況下,結果為False的居多。

相關推薦

判斷矩陣元素相連——CSharp陣列

題目如下: 題目是這樣的,判斷一個圖是不是連通圖。 一個矩陣裡邊只有0和1組成。如果矩陣裡,1周圍的8個位置,還有1,那麼這2個1就算聯通的。 如果這個圖裡所有的1都能互相聯通那麼,就這個矩陣就是聯通的,否則就是不聯通的。用演算法判斷一個矩陣是不是聯通的。 程式碼如下:

js判斷一個元素是否在陣列

js中存在一個數組,如何判斷一個元素是否存在於這個陣列中呢,首先是通過迴圈的辦法判斷,程式碼如下:var arr = ['a','s','d','f']; console.info(isInArray(arr,'a'));//迴圈的方式 /** * 使用迴圈的方式判斷一個

jquery 判斷元素是否在陣列

js 方法: var arr = ["a", "b", "c"]; // js arr.indexOf("c") var result1 = arr.indexOf("c"); //返回index為2,失敗返回-1 jquery 方法: var arr = ["a", "b", "c

判斷某個元素是否存在於某個 js 陣列

1.正則表示式 Array.prototype.in_array=function(e){ var r=new RegExp(','+e+','); return (r.test(','+th

陣列_習題:編寫一個4*4矩陣元素對角線之和的程式

# include <stdio.h>int main(void){ int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; int i, j, sum1, sum2;//定義sum1,sum2,分別存放兩條對線元素的和; sum1=sum

JS判斷元素是否在陣列

方法一:indexOf() var arr = new Array('a', 'b','c'); var index = arr.indexOf('a');//index為0 注:inde

在JSP使用EL中判斷指定元素是否存在於指定集合中

element span cti ems 頁面 指定元素 jsp 指定 col 在JSP使用EL中判斷指定元素是否存在於指定集合中 1、問題描述   在JSP頁面中使用EL表達式判斷一個指定元素是否存在於指定集合中? 2、問題解決   eg:指定集合:collection:

怎麽使用jquery判斷一個元素是否含有一個指定的類(class)

() pla jquer java 例子 add red tro lan 在jQuery中可以使用2種方法來判斷一個元素是否包含一個確定的類(class)。兩種方法有著相同的功能。2種方法如下: 1. is(‘.classname’) 2.

python中如何不區分大小寫的判斷一個元素是否在一個列表中

拒絕 結果 大小寫 over 用戶 ima image -1 技術分享 python中判斷某一個元素是否在一個列表中,可以使用關鍵字in 和 not in. 示例如下: 如果需要輸出相應的信息,可以搭配使用if語句,這裏不贅述。 ---------------------

jQuery判斷當前元素是第幾個元素&獲取第N個元素

jquer ont query font href 點擊 我們 div fun jQuery判斷當前元素是第幾個元素&獲取第N個元素 假設有下面這樣一段HTML代碼: <ul> <li>jQuery判斷當前元素是第幾個元素示例&

jQuery-----1)創建新標簽,,2)判斷某個元素是否包含某個文字

on() this size body pre ood -- appendto rep 1)創建新標簽 方法一: var ele_input=$(‘<input/>‘) ele_input.val(‘你是最棒的‘) ele_input.attr(‘class

判斷一個元素有沒有條件

元素 沒有 else right mat func pan logs cti function change(){ if ($(‘.clickImg‘).attr(‘src‘).match(‘left‘)) { $(

expected_conditions判斷頁面元素

ted 需要 frame 不可 enc bili tro 這樣的 body expected_condtions提供了16種判斷頁面元素的方法: 1.title_is:判斷當前頁面的title是否完全等於預期字符串,返回布爾值 2.title_contains:判斷當前頁面

00083_判斷集合元素唯一的原理

規則 list ash 新元素 相同 結果 code array contain 1、ArrayList的contains方法判斷元素是否重復原理   ArrayList的contains方法會使用調用方法時,傳入的元素的equals方法依次與集合中的舊元素所比較,從而根據

MATLAB基礎知識——1.4矩陣元素的引用

運算符 子矩陣 知識 str res 說明 向量 列存儲 font 矩陣元素的引用方式 (1)通過下標引用矩陣元素,下標必須為正整數,且用圓括號括起來。 (2)通過序號來引用,在MATLAB中矩陣元素按列存儲。序號與下標是一一對應的,以m*n的矩陣A為例,矩陣A(i,j)的

jQuery如何判斷input元素是否獲得焦點(點擊編輯時)

() 監聽 clas ima func 處理方法 IV col input 問題提出 如果你要判斷input元素是否獲得焦點,或者是否處在活動編輯狀態,使用jQuery的 hasFocus() 方法或 is(‘:focus‘) 方法貌似都無效!搜索網上給出的辦法,幾乎凈是采

JQuery判斷一個元素是否顯示,隱藏

spa 顯示 true string hidden 判斷 ble visible dde $("#id").is(‘:visible‘);顯示為true $("#id").is(‘:hidden‘);隱藏為trueJQuery判斷一個元素是否顯示,隱藏

從javascript判斷一個物件是否為陣列中學習js語法

1,真正的陣列的判斷方法 javascript中最簡單的宣告陣列方法為: var a = []; 判斷是否為陣列的最直接的方法為: a instanceof Array //true a .constructor == Array //true 這裡涉及到一個i

leetcode693+判斷二進位制是否相連不同數字

https://leetcode.com/problems/binary-number-with-alternating-bits/description/ class Solution { public: bool hasAlternatingBits(int n) {

每日一題之LeetCode移除元素 刪除有序陣列重複元素

這兩道題若是不使用官方題解的雙指標做法,就會涉及到淺複製,深複製的問題,可參考如下https://blog.csdn.net/qq_32907349/article/details/52190796 。其中,此題將要使用深複製,但這會違背題意中的不開闢新的記憶體空間。 1.移除元素class Soluti