C#.NET 算法题 高级篇
更新: 2023-06-30 14:11:21 字数: 0 字 时长: 0 分钟
正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
- '.' 匹配任意单个字符
- '*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。
查看代码
c#
public bool IsMatch(string s, string p)
{
if (string.IsNullOrEmpty(p)) return string.IsNullOrEmpty(s);
bool firstMatch = !string.IsNullOrEmpty(s) && (s[0] == p[0] || p[0] == '.');
if (p.Length >= 2 && p[1] == '*')
{
return IsMatch(s, p.Substring(2)) || (firstMatch && IsMatch(s.Substring(1), p));
}
else
{
return firstMatch && IsMatch(s.Substring(1), p.Substring(1));
}
}
解数独
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 1、数字 1-9 在每一行只能出现一次。
- 2、数字 1-9 在每一列只能出现一次。
- 3、数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
查看代码
c#
char[][] board = new char[9][]
{
new char[9] { '5', '3', '.', '.', '7', '.', '.', '.', '.' },
new char[9] { '6', '.', '.', '1', '9', '5', '.', '.', '.' },
new char[9] { '.', '9', '8', '.', '.', '.', '.', '6', '.' },
new char[9] { '8', '.', '.', '.', '6', '.', '.', '.', '3' },
new char[9] { '4', '.', '.', '8', '.', '3', '.', '.', '1' },
new char[9] { '7', '.', '.', '.', '2', '.', '.', '.', '6' },
new char[9] { '.', '6', '.', '.', '.', '.', '2', '8', '.' },
new char[9] { '.', '.', '.', '4', '1', '9', '.', '.', '5' },
new char[9] { '.', '.', '.', '.', '8', '.', '.', '7', '9' }
};
if (SolveSudoku(board))
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
Console.Write(board[i][j] + " ");
Console.WriteLine();
}
}
Console.ReadKey();
bool SolveSudoku(char[][] board)
{
if (board == null || board.Length == 0) return false;
Solve(board);
return true;
}
bool Solve(char[][] board)
{
for (int i = 0; i < board.Length; i++)
{
for (int j = 0; j < board[0].Length; j++)
{
if (board[i][j] == '.')
{
for (char c = '1'; c <= '9'; c++)
{
if (IsValid(board, i, j, c))
{
board[i][j] = c;
if (Solve(board))
{
return true;
}
else
{
board[i][j] = '.';
}
}
}
return false;
}
}
}
return true;
}
bool IsValid(char[][] board, int row, int col, char c)
{
for (int i = 0; i < 9; i++)
{
if (board[i][col] != '.' && board[i][col] == c) return false;
if (board[row][i] != '.' && board[row][i] == c) return false;
if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] != '.' && board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false;
}
return true;
}