当前位置: 代码迷 >> 综合 >> CF1530B Putting Plates(简单构造,模拟)
  详细解决方案

CF1530B Putting Plates(简单构造,模拟)

热度:95   发布时间:2023-10-13 23:54:32.0

原题链接

题意

给一个 n?mn * mn?m 的矩阵(桌子),在这个上面放盘子,只能在边缘放,且每个盘子的上、下、左、右、左上、右上、左下、右下 都不能有别的盘子,问最多能放几个盘子,输出一个方案,0 代表空,1 代表盘子,每个方案之间有一个换行。

思路

从右上角 (1,1)开始放,遍历四个边缘,然后能放则放,每放一个把周围八个方向标为 -1,即可。

代码

#include<bits/stdc++.h> 
using namespace std;int xx[8] = {
    1, 0, -1, 0, 1, 1, -1, -1};
int yy[8] = {
    0, 1, 0, -1, 1, -1, 1, -1};int main()
{
    int t;cin >> t;while (t -- ){
    int n, m; cin >> n >> m;int g[n + 10][m + 10] = {
    0};for (int i = 1; i <= m; i ++ ) {
    if (g[1][i] == 0){
    g[1][i] = 1;for (int j = 0; j < 8; j ++ ){
    int dx = 1 + xx[j];int dy = i + yy[j];g[dx][dy] = -1;}}}for (int i = 1; i <= m; i ++ ) {
    if (g[n][i] == 0){
    g[n][i] = 1;for (int j = 0; j < 8; j ++ ){
    int dx = n + xx[j];int dy = i + yy[j];g[dx][dy] = -1;}}}for (int i = 1; i <= n; i ++ ) {
    if (g[i][1] == 0){
    g[i][1] = 1;for (int j = 0; j < 8; j ++ ){
    int dx = i + xx[j];int dy = 1 + yy[j];g[dx][dy] = -1;}}}for (int i = 1; i <= n; i ++ ) {
    if (g[i][m] == 0){
    g[i][m] = 1;for (int j = 0; j < 8; j ++ ){
    int dx = i + xx[j];int dy = m + yy[j];g[dx][dy] = -1;}}}for (int i = 1; i <= n; i ++ ){
    for (int j = 1; j <= m; j ++ ){
    if (g[i][j] == 1) cout << 1;else cout << 0;}cout << endl;}cout << endl;}return 0; 
}

总结

超简单的题目哒!