描述

题目描述

首先会给定我们一个mnm * n的一个二维数组, 然后我们要进行以下的操作, 最大是999 * 9

然后我们判断我们下面的五种操作, 如果可以实现输出00, 如果不可以实现输出1-1

  1. 初始化一个mnm * n的二维数组
  2. 输入x1,y1,x2,y2x1, y1, x2, y2, 然后我们交换(x1,y1)(x1, y1)(x2,y2)(x2, y2)
  3. 输入xx, 在第xx行的上方添加一行
  4. 输入yy, 在第yy列左边添加一列
  5. 输入x,yx, y, 查找坐标(x,y)(x, y)

题解

解法一: 直接模拟

实现思路

我们可以直接简单的取一个个的比较模拟, 其实关键就是这么几个点

  1. 数据表行列范围都是[0, 9]
  2. 交换的坐标行列数要在输入的表格大小行列数范围[0, m) x [0, n)内
  3. 插入的 x 位置要在 [0, m) 范围内,插入的 y 位置要在 [0, n) 范围内, 并且列和行不能超过9
  4. 要检查的位置 (x, y) 要在 [0, m) x [0, n) 内

图解代码

20220309061141

代码实现

#include <bits/stdc++.h>

using namespace std;

signed main() {
    int n, m, x1, y1, x2, y2, xi, yi, x, y;
    while (cin >> n >> m >> x1 >> y1 >> x2 >> y2 >> xi >> yi >> x >> y) {
    	if (n >= 0 && n <= 9 && m >= 0 && m <= 9) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    	// 判断数据表的范围是否正确
    	
    	if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < m && x2 >= 0 && x2 < n && y2 >= 0 && y2 < m) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    	// 判断我们交换的数据是否在我们的数据表中
    	
    	if (xi >= 0 && xi < n && n + 1 <= 9) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    	if (yi >= 0 && yi < m && m + 1 <= 9) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    	// 判断我们插入的元素是否满足范围
    	
    	if (x >= 0 && x < n && y >= 0 && y < m) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    	// 判断我们查找的元素是否正确
    }
	return 0;
}

时空复杂度分析

时间复杂度: O(1)O(1)

理由如下: 我们直接进行的判断

空间复杂度: O(1)O(1)

理由如下: 只是使用了常数级别的空间

解法二: C++的类的思想

实现思路

我们可以使用C++的类的思想, 我们把我们的这个操作封装成一个类, 我们每一次都是对一个类进行一个操作

代码实现

#include <bits/stdc++.h>

using namespace std;

class Martix {
   protected:
    int n, m, x1, y1, x2, y2, xi, yi, x, y;

   public:
    Martix() {}
    Martix(int n_, int m_, int x1_, int y1_, int x2_, int y2_, int xi_, int yi_,
           int x_, int y_)
        : n(n_), m(m_), x1(x1_), y1(y1_), x2(x2_), y2(y2_), xi(xi_), yi(yi_), x(x_), y(y_){}
    // 判断初始化是否满足条件
    void init() {
        if (n >= 0 && n <= 9 && m >= 0 && m <= 9) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    }

    // 检验交换的数据是否满足条件
    void checkSwap() {
        if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < m && x2 >= 0 && x2 < n && y2 >= 0 && y2 < m) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    }

    // 检查插入的数据是否满足条件
    void checkInsert() {
        if (xi >= 0 && xi < n && n + 1 <= 9) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    	if (yi >= 0 && yi < m && m + 1 <= 9) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    }

    // 检查查找的元素是否正确
    void checkSerch() {
        if (x >= 0 && x < n && y >= 0 && y < m) {
    		cout << "0\n";
    	} else {
    		cout << "-1\n";
    	}
    }
};

signed main() { 
    int n, m, x1, y1, x2, y2, xi, yi, x, y;
    while (cin >> n >> m >> x1 >> y1 >> x2 >> y2 >> xi >> yi >> x >> y) {
        Martix martix(n, m, x1, y1, x2, y2, xi, yi, x, y);
        martix.init();
        martix.checkSwap();
        martix.checkInsert();
        martix.checkSerch();
    }
    return 0; 
}

时空复杂度分析

时间复杂度: O(1)O(1)

理由如下: 我们直接进行的判断

空间复杂度: O(1)O(1)

理由如下: 只是使用了常数级别的空间