今天比赛的c题,就是数据范围比较大,两个特别大的数相除后会有小数比大小会出现精度问题,这时简单的方法是可以将除法的比大小变成乘法的比大小,比如a/b>c/d可以变成ad>cb,这样可以避免小数的精度问题,然后当一个数有多个部分时,用结构体,结构体比大小bool cmp
字符串的比大小直接用string中的strcmp(str1,str2)==0表示两字符串完全相等
按一个字符串走迷宫,比如“xzytc",用bfs,结构体队列queue,queue<Node> q,记录idx,走到字符串的哪个位置,我这个字符串是5,就s[(idx+1)]%5来走。
#include<bits/stdc++.h>
using namespace std;
const int N=510;
char s[N][N];
int vis[N][N];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct Node{
int x,y,idx;//idx表示到snuke的第几个字母了
};
string str;
int main()
{
str="snuke";
int h,w;
cin>>h>>w;
for(int i=0;i<h;i++)
{
cin>>s[i];
}
//bfs
queue<Node> q;
q.push({0,0,0});
vis[0][0]=1;
while(!q.empty())
{
Node temp=q.front();
q.pop();
//终止条件
if(temp.x==h-1&&temp.y==w-1)//到最后一个点
{
cout<<"Yes";
return 0;
}
//遍历四个方向
for(int i=0;i<4;i++)
{
int nx=temp.x+dir[i][0];
int ny=temp.y+dir[i][1];
if(nx<0||nx>=h||ny<0||ny>=w||vis[nx][ny])
{
continue;
}
if(s[nx][ny]!=str[(temp.idx+1)%5]) continue;//字符不符合
q.push({nx,ny,(temp.idx+1)%5});
vis[nx][ny]=1;
}
}
cout<<"No";
return 0;
}
和前天的bfs很相似