ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

矩阵

2021-12-12 12:32:10  阅读:166  来源: 互联网

标签:digit false int jiugongge memset 矩阵 board


请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
 

注意:

一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 '.' 表示。

点击查看代码
class Solution {
    public boolean isValidSudoku(char[][] board) {
        //定义数字行内出现的次数
        int[][] row = new int[9][9];
        //定义数字列内出现的次数
        int[][] column = new int[9][9];
        //定义数字九宫格内出现的次数最大为9次
        int[][][] jiugongge = new int[3][3][9];
        //遍历数组
        for (int i =0;i <9;i++){
            for(int j = 0;j<9;j++){
                char c = board[i][j];
                //只要存在数字
                if (c !='.'){
                    //把数字-1化成索引下标,c是字符串要减去字符串,-1会报错。
                    int index = c-'1';
                    //这个时候++意思是第i行这个c值次数+1,默认row第二位就是{1-9}-1;每一行都有可能是1-9
                    //例如现在是第一行第一列是9,就在row[1][8]号位置+1
                    row[i][index]++;
                    //列同理
                    column[j][index]++;
                    //并且九宫格内次数也要+1,例如也是第1行第一列,i/3 j/3会自动定位到所在的小宫格
                    jiugongge[i/3][j/3][index]++;
                    //次数大于1就不成立一个数独
                    if (row[i][index]>1||column[j][index]>1||jiugongge[i/3][j/3][index]>1) return false;
                }
            }
        }
        return true;
    }
}
点击查看代码
class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
  int rol[9][9];
        int col[9][9];
        int jiugongge[3][3][9];
        
        memset(rol,0,sizeof(rol));
        memset(col,0,sizeof(col));
        memset(jiugongge,0,sizeof(jiugongge));

for (int i=0;i<9;i++)
{
    for(int j=0;j<9;j++)
    {
        char c=board[i][j];
        if(c!='.')
        {
            int index=c-'1';
            rol[i][index]++;
             col[j][index]++;
             jiugongge[i/3][j/3][index]++;
             if(rol[i][index]>1||col[j][index]>1||jiugongge[i/3][j/3][index]>1)
             return false;
        }
    }
}
return true;
    }
};

 

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。

 

点击查看代码
class Solution {
private:
//
    bool line[9][9];
    bool column[9][9];
    bool block[3][3][9];
  //
    bool valid;
    //空格
    vector<pair<int, int>> spaces;

public:

    void dfs(vector<vector<char>>& board, int pos) {
//结束
        if (pos == spaces.size()) {
            valid = true;
            return;
        }
//
        auto [i, j] = spaces[pos];
  
        for (int digit = 0; digit < 9 && !valid; ++digit) {
            if (!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) {
                line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
                board[i][j] = digit + '0' + 1;
                dfs(board, pos + 1);
                line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false;
            }
        }
    }

    void solveSudoku(vector<vector<char>>& board) {
        memset(line, false, sizeof(line));
        memset(column, false, sizeof(column));
        memset(block, false, sizeof(block));
        valid = false;

        for (int i = 0; i < 9; ++i) {
            for (int j = 0; j < 9; ++j) {
                if (board[i][j] == '.') {
                    spaces.emplace_back(i, j);
                }
                else {
                    int digit = board[i][j] - '0' - 1;
                    line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
                }
            }
        }

        dfs(board, 0);
    }
};

 

 

 

点击查看代码
class Solution {
    private:
    int row[9][9];
    int col[9][9];
    int jiugongge[3][3][9];
    bool valid;
    vector<pair<int,int>>spaces;
public:
void bfs(vector<vector<char>>&board,int pos)
{
    if(pos==spaces.size())
    {
valid=true;
return;
    }
    auto[i,j]=spaces[pos];
    for(int digit=0;digit<9&&!valid;++digit)
    {
        if(!row[i][digit]&&!col[j][digit]&&!jiugongge[i/3][j/3][digit])
        {
            row[i][digit]=col[j][digit]=jiugongge[i/3][j/3][digit]=true;
            board[i][j]=digit+'1';
            bfs(board,pos+1);
            row[i][digit]=col[j][digit]=jiugongge[i/3][j/3][digit]=false;
        }
    }
}
    void solveSudoku(vector<vector<char>>& board) {
memset(row,false,sizeof(row));
memset(col,false,sizeof(col));
memset(jiugongge,false,sizeof(jiugongge));
valid=false;
for(int i=0;i<9;++i)
{
    for(int j=0;j<9;++j)
    {
        if(board[i][j]=='.')
        {
            spaces.emplace_back(i,j);

        }
        else{
            int digit=board[i][j]-'1';
            row[i][digit]=col[j][digit]=jiugongge[i/3][j/3][digit]=true;

        }
    }
}
bfs(board,0);
    }
};

 

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

 

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {

        int n=matrix.size();
for(int i=0;i<n/2;++i)
{
    for(int j=0;j<(n+1)/2;++j)
    {
        int temp=matrix[i][j];
        matrix[i][j]=matrix[n-j-1][i];
        matrix[n-j-1][i]=matrix[n-i-1][n-j-1];
        matrix[n-i-1][n-j-1]=matrix[j][n-i-1];
        matrix[j][n-i-1]=temp;
    }
}
    }
};

二进制求和,满二进一

首先让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引。
然后从后到前遍历所有的位数,同位相加,这里有一个点,用的是字符相加,利用 ASCII 码,字符在内部都用数字表示,我们不需要知道具体数值,但可知 ‘0’-‘0’ = 0, ‘0’+1=‘1’,以此类推 。字符的加减,大小比较,实际上都是内部数字的加减,大小比较
判断相加后的字符,若大于等于字符 ‘2’‘2’,下一位需要进一
第 00 位数的相加在这里是单独处理的,因为它可能涉及到字符的插入(即是否需要在最前面加一位数 ‘1’‘1’

 

点击查看代码
class Solution {
public:
	string addBinary(string a, string b) 
	{
		int asize = a.size(), bsize = b.size();
		while (asize > bsize)//补齐
		{
			b = '0' + b;
			bsize++;
		}
		while (asize < bsize)
		{
			a = '0' + a;
			asize++;
		}
		int carry = 0;  //进位
		for (int i = asize - 1; i >= 0; i--)
		{
			int sum = a[i] - '0' + b[i] - '0' + carry;
			a[i] = (sum) % 2+'0';//本位数值
			carry = sum / 2;//进位更新
		}
		if (carry > 0)//有溢出
			a = '1' + a;
		return a;
	}
};

标签:digit,false,int,jiugongge,memset,矩阵,board
来源: https://www.cnblogs.com/love-cherry/p/15651995.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有