思路
很简单,标记,最后输出
#include<bits/stdc++.h>
using namespace std;
int n,a[5]={1,0,0,-1},b[5]={0,1,-1,0},s[35][35];
void f(int x,int y)
{
if(s[x][y]==1)return;
if(s[x][y]==3)return;
s[x][y]=3;
for(int k=0;k<4;k++)
{
int h=x+a[k],p=y+b[k];
if(h>=0&&h<=n+1&&p>=0&&p<=n+1)
{
f(h,p);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)cin>>s[i][j];
}
f(0,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i][j]==0)cout<<2<<" ";
else if(s[i][j]==1)cout<<1<<" ";
else cout<<0<<" ";
}
cout<<endl;
}
return 0;
}
思路
定义结构体node,定义队列 q,简单的说就是:初始化、处理非法、判断是否到达、扩展。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int h,s;
};
queue<node>q;
int n,v[1000005];
int main()
{
q.push({1,0});
cin>>n;
while(!q.empty())
{
node t=q.front();
q.pop();
if(v[t.h])continue;
v[t.h]=1;
if(t.h<=0||t.h>n)continue;
if(t.h==n)
{
cout<<t.s;
return 0;
}
int a=t.h-1,b=t.h+1,c=t.h*2;
if(a>1&&a<=n&&v[a]==0)
{
q.push({a,t.s+1});
}
if(b>1&&b<=n&&v[b]==0)
{
q.push({b,t.s+1});
}
if(c>1&&c<=n&&v[c]==0)
{
q.push({c,t.s+1});
}
}
return 0;
}
思路
读入字符串。然后每一个字符串内部都要进行一次排序,再将全部字符串排一遍。这样下来,全部组成这个字符串的字母的数量相等的字符串就都应是相邻的了。所以我们只需统计,有多少个相邻的字符串是不一样的,就可以统计出有多少种不同的了。
#include<bits/stdc++.h>
using namespace std;
long long n,h;
string s[100005];
int main()
{
cin>>n;
for(long long i=1;i<=n;i++)
{
cin>>s[i];
sort(s[i].begin(),s[i].end());
}
sort(s+1,s+n+1);
for(long long i=1;i<=n;i++)if(s[i-1]!=s[i])h++;
cout<<h;
return 0;
}
思路
只判断周围8个格子就掉坑了
把题目抽象一下,其实相当于给你两个点,判断连线上是否有其它点。
兔八哥有危险当且仅当它与猎人的横纵坐标之差互质。
#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,d;
int gcd(int x,int y)
{
if(y==0)return x;
else return (gcd(y,x%y));
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a>>b>>c>>d;
if(gcd(abs(a-c),abs(b-d))==1)cout<<"no\n";
else cout<<"yes\n";
}
return 0;
}
思路
先把所有人的等级从小到大排序,算出相邻的两项的差,再查找
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,h,j;
}a[1000005],b[1000005];
bool p(node a,node b)
{
if(a.x<b.x)return true;
else return false;
}
int main()
{
long long s=0;
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i].x;
}
sort(a,a+n,p);
for(int i=0;i<n-1;i++)
{
b[i].x=a[i+1].x-a[i].x;
b[i].j=i;
}
sort(b,b+n-1,p);
int y,m=0;
for(int i=0;i<k;i++)
{
y=1;
while(y)
{
if(a[b[m].j+1].h==0&&a[b[m].j].j==0)
{
y=0;
a[b[m].j+1].h=1;
a[b[m].j].j=1;
s+=b[m].x;
}
m++;
}
}
cout<<s;
return 0;
}
如有错误,欢迎大家评论区指出!感谢!