Exemplo n.º 1
0
        public MMatrix clone()
        {
            int rows   = rowCount();
            int cols   = columnCount();
            var result = new MMatrix(rows, cols);

            for (int i = 0; i < rowCount(); i++)
            {
                for (int j = 0; j < columnCount(); j++)
                {
                    result.values[i][j] = values[i][j];
                }
            }
            return(result);
        }
Exemplo n.º 2
0
        public MMatrix multiply(MMatrix other)
        {
            int rows   = rowCount();
            int cols   = other.columnCount();
            int cells  = columnCount();
            var result = new MMatrix(rows, cols);

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    int sum = 0;
                    for (int k = 0; k < cells; k++)
                    {
                        sum = (sum + (get(i, k) * other.get(k, j)) % 2) % 2;
                    }
                    result.set(i, j, sum);
                }
            }
            return(result);
        }
Exemplo n.º 3
0
        public bool CanBeSolved(Board bb)
        {
            int r = bb.GetLength(0), c = bb.GetLength(1);

            int[] b     = new int[r * c];
            int   index = 0;

            for (int i = 0; i < r; i++)
            {
                for (int j = 0; j < c; j++)
                {
                    b[index++] = bb[i, j]? 1 : 0;
                }
            }
            var ASize = r * c;
            var A     = new MMatrix(ASize, ASize);

            for (int Arow = 0; Arow < ASize; Arow++)
            {
                for (int Acol = 0; Acol < ASize; Acol++)
                {
                    int i, j, i_, j_ = 0;
                    i  = Arow / c;
                    j  = Arow % c;
                    i_ = Acol / c;
                    j_ = Acol % c;
                    if (i_ >= 0 && i_ <= ASize && j_ >= 0 && j_ <= ASize)
                    {
                        if (Math.Abs(i - i_) + Math.Abs(j - j_) <= 1)
                        {
                            A.set(Arow, Acol, 1);
                        }
                        else
                        {
                            A.set(Arow, Acol, 0);
                        }
                    }
                }
            }
            for (int i = 0; i < b.Length; i++)
            {
                A.setBVector(i, 0, b[i]);
            }
            A.reducedRowEchelonForm();
            Func <MMatrix, bool> canBeSolved = (m) =>
            {
                for (int curr_Row = r * c - 1; curr_Row >= 0; curr_Row--)
                {
                    for (int i = 0; i < r * c; i++)
                    {
                        if (m.get(curr_Row, i) != 0)
                        {
                            return(true);
                        }
                    }
                    if (m.getBVector(curr_Row, 0) != 0)
                    {
                        return(false);
                    }
                }
                return(true);
            };

            return(canBeSolved(A));
        }
Exemplo n.º 4
0
        public override IList <Node> Solve()
        {
            int r = Initial.GetLength(0), c = Initial.GetLength(1);

            //Matrix<double> O = Matrix<double>.Build.Dense(r, c, 0),
            //               I = Matrix<double>.Build.DenseDiagonal(r, c, 1),
            //               B = Matrix<double>.Build.Dense(r, c, 0);
            //for (int i = 0; i < r; i++)
            //{
            //    B[i, i] = 1;
            //    if (_isValid(B, i + 1, i))
            //        B[i + 1, i] = 1;
            //    if (_isValid(B, i, i + 1))
            //        B[i, i + 1] = 1;
            //}
            //IList<Matrix<double>[]> list = new List<Matrix<double>[]>();
            //for (int i = 0; i < r; i++)
            //{
            //    list.Add(_createRow(i, O, I, B));
            //}
            //var A = Matrix<double>.Build.DenseOfMatrixArray(_createRectangularArray(list));
            //var b = Matrix<double>.Build.Dense(r, c, 0);
            //var copy = Matrix<double>.Build.DenseOfMatrix(A);
            //Console.WriteLine(A);
            ////_reduce(A);
            //A = Matrix<double>.Build.DenseOfArray(_reduce(A.ToArray()));
            //Console.WriteLine(A);
            //var R = copy * A.Inverse();
            //var result = Matrix<double>.Build.Dense(r, c, 0);
            //for (int i = 0; i < r; i++)
            //{
            //    for (int j = 0; j < c; j++)
            //    {
            //        result[i, j] = (int)(Math.Floor(R[i, j]) * (Initial[i, j] == Node.State.ON ? 1 : 0));
            //    }
            //}
            //IList<Node> nodes = new List<Node>();
            //var last = new Node() { Board = Initial };
            //nodes.Add(last);
            //result = result.Map(e => Math.Round(e));
            //for (int i = 0; i < r; i++)
            //{
            //    for (int j = 0; j < c; j++)
            //    {
            //        if (result[i, j] >= 1)
            //        {
            //            var bb = last.Board.Clone() as Node.State[,];
            //            _click(bb, i, j);
            //            var node = new Node() { Board = bb };
            //            nodes.Add(node);
            //            last = node;
            //        }
            //    }
            //}
            //return nodes;
            int[] b     = new int[r * c];
            int   index = 0;

            for (int i = 0; i < r; i++)
            {
                for (int j = 0; j < c; j++)
                {
                    b[index++] = Initial[i, j]? 1 : 0;
                }
            }
            var ASize = r * c;
            var A     = new MMatrix(ASize, ASize);

            for (int Arow = 0; Arow < ASize; Arow++)
            {
                for (int Acol = 0; Acol < ASize; Acol++)
                {
                    int i, j, i_, j_ = 0;
                    i  = Arow / c;
                    j  = Arow % c;
                    i_ = Acol / c;
                    j_ = Acol % c;
                    if (i_ >= 0 && i_ <= ASize && j_ >= 0 && j_ <= ASize)
                    {
                        if (Math.Abs(i - i_) + Math.Abs(j - j_) <= 1)
                        {
                            A.set(Arow, Acol, 1);
                        }
                        else
                        {
                            A.set(Arow, Acol, 0);
                        }
                    }
                }
            }
            for (int i = 0; i < b.Length; i++)
            {
                A.setBVector(i, 0, b[i]);
            }
            A.reducedRowEchelonForm();
            Func <MMatrix, bool> canBeSolved = (m) =>
            {
                for (int curr_Row = r * c - 1; curr_Row >= 0; curr_Row--)
                {
                    for (int i = 0; i < r * c; i++)
                    {
                        if (m.get(curr_Row, i) != 0)
                        {
                            return(true);
                        }
                    }
                    if (m.getBVector(curr_Row, 0) != 0)
                    {
                        return(false);
                    }
                }
                return(true);
            };

            if (canBeSolved(A))
            {
                int[][] solution = new int[r][];
                for (int i = 0; i < r; i++)
                {
                    solution[i] = new int[c];
                }
                for (int i = 0; i < ASize; i++)
                {
                    solution[i / r][i % c] = A.getBVector(i, 0);
                }
                IList <Node> nodes = new List <Node>();
                var          last  = new Node(new HashSet <Tuple <int, int> >())
                {
                    Board = Initial
                };
                nodes.Add(last);
                for (int i = 0; i < r; i++)
                {
                    for (int j = 0; j < c; j++)
                    {
                        if (solution[i][j] == 1)
                        {
                            var bb = last.Board.Clone() as Board;
                            bb.Click(i, j);
                            var node = new Node(null)
                            {
                                Board = bb
                            };
                            nodes.Add(node);
                            last = node;
                        }
                    }
                }
                return(nodes);
            }
            return(new List <Node>());
        }