10 条题解

  • 1
    @ 2024-7-7 19:00:45

    简单的无限网格问题

    题目大意

    有一个无限大的网格,有一个点在 (1,1)(1,1) 处。它可以向上、下、左、右四个方向移动,移动的格数不限。但对于每个第 ii 次移动,格数的奇偶性必须与 ii 相同。求移动到 (n,m)(n,m) 的最少步数。

    思路

    妥妥的分类讨论题。

    首先,我们发现题目中提到了奇偶性这三个字,那么我们就优先从奇偶性来分析。

    因为题中提到:n,m2n,m\ge 2,因此,不可能 11 步走到。考虑剩下的一种最优情况,即 22 步走到。此时正好走了一个奇数和一个偶数,而此时到了 (n,m)(n,m),说明 n,mn,m奇偶性不同

    既然有奇偶性不同的情况,当然也得考虑奇偶性相同的情况。此时,很显然 22 步也是走不到的。这时,我们在分两个情况进行讨论。

    1. n,mn,m 均为奇数,此时我们可以先横向走到 (1,m)(1,m),再纵向走到 (n+1,m)(n+1,m)(n1,m)(n-1,m)。接着又可以走奇数步,就把差的 11 格补上就好了。

    2. n,mn,m 均为偶数,此时我们可以先横向走到 (1,m+1)(1,m+1)(1,m1)(1,m-1),再纵向走到 (n,m+1)(n,m+1)(n,m1)(n,m-1)。接着又可以走奇数步,就把差的 11 格补上就好了。

    综上所述,奇偶性不同时,需要 22 步走到;奇偶性相同时,需要 33 步走到。

    复杂度

    时间复杂度:

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

    空间复杂度:

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

    Code

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
    	int t,n,m;
    	cin>>t;
    	while(t--){
    		cin>>n>>m;
    		if(n%2 != m%2) cout<<2<<endl;//奇偶性不同
    		else cout<<3<<endl;//奇偶性相同
    	}
    	return 0;
    }
    

    信息

    ID
    7
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    346
    已通过
    242
    上传者