0
点赞
收藏
分享

微信扫一扫

Acwing第 44 场周赛【完结】

妖妖妈 2022-03-30 阅读 36
算法c++

目录

4317. 不同正整数的个数【签到】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int n,x;
map<int,int>mp;
int main(void)
{
    cin>>n;
    for(int i=0;i<n;i++) 
    {
        cin>>x;
        if(x>0) mp[x]++;
    }
    cout<<mp.size();
	return 0;
}

4318. 最短路径【思维】

在这里插入图片描述
很容易想到不能有环。
在这里插入图片描述
再者就是上述情况,你会发现如果有几个块在一块的话是不行的。
故在移动的同时对于一个点,最多有一个相邻的点。

#include<bits/stdc++.h>
using namespace std;
const int N=210;
int a[N][N],x,y;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
string s;
bool flag=1;
int main(void)
{
    cin>>s;
    x=200,y=200,a[x][y]=1;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='U') x--;
        if(s[i]=='D') x++;
        if(s[i]=='L') y--;
        if(s[i]=='R') y++;
        int cnt=0;
        for(int j=0;j<4;j++)
        {
            int tempx=x+dx[j];
            int tempy=y+dy[j];
            cnt+=a[tempx][tempy];
        }
        if(cnt>1) flag=0;
        if(a[x][y]) flag=0;
        a[x][y]=1;
    }
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}

比较好想的就是跑一遍,将对应的点标记,其余的都是初始的0(即为障碍物)。
bfs一遍看最小步数,是不是我们操作的步数即可。

#include<bits/stdc++.h>
using namespace std;
const int N=210;
typedef pair<int,int> PII;
int a[N][N],stx,sty,edx,edy;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
int dist[N][N];
string s;
bool flag=1;
void bfs(int x,int y)
{
    int st[N][N]={0};
    queue<PII>q; q.push({x,y}); st[x][y]=1;
    dist[x][y]=0;
    while(q.size())
    {
        auto temp=q.front(); q.pop();
        x=temp.first,y=temp.second;
        if(x==edx&&y==edy)
        {
            if(dist[edx][edy]!=s.size()) flag=0;
            return;
        }
        for(int i=0;i<4;i++)
        {
            int tempx=x+dx[i];
            int tempy=y+dy[i];
            if(st[tempx][tempy]) continue;
            if(!a[tempx][tempy]) continue;
            st[tempx][tempy]=1;
            dist[tempx][tempy]=dist[x][y]+1;
            q.push({tempx,tempy});
        }
    }
}
int main(void)
{
    cin>>s;
    stx=200,sty=200,edx=200,edy=200;
    a[edx][edy]++;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='U') edx--;
        if(s[i]=='D') edx++;
        if(s[i]=='L') edy--;
        if(s[i]=='R') edy++;
        a[edx][edy]++;
    }
    bfs(stx,sty);
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}

4319. 合适数对【数论】

在这里插入图片描述

举报

相关推荐

0 条评论