第一题
解题思路:
找到两条对角线坐标的规律后一一遍历,
整个矩阵除去对角线就是非对角线,再对非对角线一一遍历
class Solution
{
public:
bool checkXMatrix(vector<vector<int>>& grid)
{
for(int i = 0; i < grid.size(); i++)
{
for(int j = 0; j < grid[0].size(); j++)
{
if (i == j || (i + j) == grid.size() - 1) // 对角线
{
if (grid[i][j] == 0)
return false;
}
else // 非对角线
{
if (grid[i][j] != 0)
return false;
}
}
}
return true;
}
};
第二题
解题思路:
单独考虑一侧地块,定义 f[i],f[i] 表示前i个地块放置房子的方案数,
其中第i个地块可以放房子,也可以不放房子。考虑第i个地块:
1、若不放房子,那么第i-1个地块可放可不放,则有 f[i] = f[i-1];
2、若放房子,那么第 i-1个地块无法放房子,第 i-2个地块可放可不放,则有 f[i] = f[i-2]
所以f[i] = f[i-1] + f[i-2]
综合考虑两侧的地块,最终的方式数应该为f[n]*f[n]
const int MOD = 1e9 + 7, N = 1e4 + 1;
int f[N] = {1, 2};
int init = []()//Lambda表达式
{
for (int i = 2; i < N; ++i)
f[i] = (f[i - 1] + f[i - 2]) % MOD;
return 0;
}();
class Solution
{
public:
int countHousePlacements(int n)
{
return (long long) f[n] * f[n] % MOD;
}
};