1-323作业

文章介绍了四个C++编程问题的解决方案,包括路径搜索、利用队列扩展节点、字符串排序及相邻字符计数、判断坐标差是否互质以及按等级排序的问题。
摘要由CSDN通过智能技术生成

P1162 填涂颜色

B3626 跳跃机器人

P1808 单词分类

0P1170 兔八哥与猎人

P1626 象棋比赛

思路

很简单,标记,最后输出

 

#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;
}

 如有错误,欢迎大家评论区指出!感谢!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值