链接:https://ac.nowcoder.com/acm/problem/200203
来源:牛客网
给定一个棋盘,已知棋盘的行数和列数是 n,mn,m,每个整数坐标处都有一个糖果,KevenKeven 初始在棋盘的左下角 (1,1)(1,1) 出发,并且 KevenKeven 每次只能跳 ”日” 字,假设 KevenKeven 可以跳无数次,但不可以跳出棋盘,现在 KevenKeven 想知道他能否拿到棋盘上的所有糖果。
输入描述:
在一行中给出两个数字 n,mn,m,表示棋盘的大小 (1<=n,m<=2000)(1<=n,m<=2000)
输出描述:
若 KevenKeven 能拿到棋盘上所有的糖果,则输出 “Yes”,否则,输出 “No”
示例1
输入
4 4
输出
Yes
说明
KevenKeven 可以走到所有的点上并且拿到所有的糖果。
示例2
输入
3 3
输出
No
说明
棋盘如图所示,KevenKeven 一开始在左下角 (1,1)(1,1) ,此时 KevenKeven 除了中间的点 (2,2)(2,2) 无法走到,其他点都可到达。
备注:
若Keven现在在黄色的点上,那么他可以跳到图中的8个红色点处。
方法一:
直接找出所有无法满足条件的情况,然后剩下的就直接输出No
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if(n<m)
swap(n,m);
if(n==1&&m==1)
cout<<"Yes"<<endl;
else if(n>=4&&m>=3)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}
方法二:
搜索去做,我用的是DFS
#include<bits/stdc++.h>
using namespace std;
int n,m,vis[2020][2020];
int ans;
int dx[8]={-2,2,-1,1,-2,2,-1,1};
int dy[8]={1,1,2,2,-1,-1,-2,-2};
void dfs(int x,int y)
{
if(vis[x][y]==1)
return ;
ans++;
vis[x][y]=1;
for(int i=0;i<8;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=1&&xx<=n&&yy<=m&&yy>=1&&vis[xx][yy]==0)
dfs(xx,yy);
}
}
int main()
{
cin>>n>>m;
memset(vis,0,sizeof(vis));
dfs(1,1);
if(ans==n*m)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}