目录
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;
}