38、《信息学奥赛一本通 编程启蒙 C++版》 3371-3380(10题)

1、3371:【例64.2】 生日相同

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3.1数据结构之结构_6377生日相同 2.0
http://noi.openjudge.cn/ch0301/6377/
*/
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
struct note
{
	char name[18];
	int m,n;
} a[175];

int hx[13][31],n,i,j,k,ok=0;

int cmp(note a,note b)
{
	if(strlen(a.name)==strlen(b.name))
		return strcmp(a.name, b.name)<0;
	return strlen(a.name)<strlen(b.name);
}
int main()
{
	cin>>n;
	for(i=0; i<n; i++)
	{
		cin>>a[i].name>>a[i].m>>a[i].n;
		hx[a[i].m][a[i].n]++;
	}
	sort(a,a+n,cmp);
	
	for(i=1; i<=12; i++)
	for(j=1; j<=30; j++)
		if(hx[i][j]>=2)
		{
			ok=1;
			cout<<i<<" "<<j;
			for(k=0; k<n; k++)
				if(a[k].m==i && a[k].n==j)
					cout<<" "<<a[k].name;
			cout<<endl;
		}
		
	if(!ok)
		cout<<"None"<<endl;
	
	return 0;
}



2、3372:练64.1 图像旋转

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
NOI / 1.8编程基础之多维数组
11图像旋转 2021.12.14 AC
http://noi.openjudge.cn/ch0108/solution/32095231/
*/
#include<iostream>
#define MAX 105
using namespace std;
int a[MAX][MAX];
int main()
{
    int n,m,k;
    cin>>n>>m;
    for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>a[i][j];
    for(int i=0;i<m;++i)
    {
        for(int j=n-1;j>=0;--j)
        {
            if(j!=n-1)
            {
                cout<<" "<<a[j][i];
            }
            else
            {
                cout<<a[j][i];
            }      
        }
        cout<<endl;
    }
    return 0;  
}



3、3373:练64.2 图像旋转翻转变换

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

#include<bits/stdc++.h>
using namespace std;
int a[105][105],b[105][105],m,n,q,i,j;
int main()
{
	char c;
	cin>>m>>n;
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		cin>>a[i][j];
	}
	
	while(cin>>c)
	{
		for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			switch(c)
			{
				case'A':b[j][m-i+1]=a[i][j];break;
				case'B':b[n-j+1][i]=a[i][j];break;
				case'C':b[i][n-j+1]=a[i][j];break;
				case'D':b[m-i+1][j]=a[i][j];break;
				default:break;
			}
		memcpy(a,b,sizeof(a));
		if(c=='A'||c=='B')
		{
			q=m;
			m=n;
			n=q;
		}
	}
	
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)cout<<a[i][j]<<" ";
		cout<<endl;
	}
	
	return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int a[101][101],b[101][101];
char e[101]; 

void A(int &m,int &n)
{
	int i,j,temp;
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		b[j][m+1-i]=a[i][j];
	}

	temp=m;m=n;n=temp;
	
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		a[i][j]=b[i][j];
    }
	
}
void B(int &m,int &n)
{
	A(m,n);
	A(m,n);
	A(m,n);
}
void C(int &m,int &n)
{
	int i,j;
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		b[i][n+1-j]=a[i][j];
	}
	
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		a[i][j]=b[i][j];
	}	
}

void D(int &m,int &n)
{
	int i,j;
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		b[m+1-i][j]=a[i][j];
	}
	
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		a[i][j]=b[i][j];
	}	
}

void xz(char t,int &m,int &n)
{
	if(t=='A')  A(m,n);
	if(t=='B')  B(m,n);
	if(t=='C')  C(m,n);
	if(t=='D')  D(m,n);
} 
int main()
{
	int i,j,m,n;
	scanf("%d%d",&m,&n);
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	{
		scanf("%d",&a[i][j]);
	}
	
	scanf("%s",e);
	
	for(i=0;i<strlen(e);i++)
	{
		xz(e[i],m,n);
	}
	
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}



4、3374:练64.3 打印沙漏

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3374:练64.3 打印沙漏
http://bas.ssoier.cn:8086/problem_show.php?pid=3374

pta-打印沙漏
https://blog.csdn.net/mao2957/article/details/129988896
*/
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    //总体思路:可以将一个三角形看作一个等差数列
    //三角形第一层为一个字符,相当于a1为1
    //三角形的每一层刚好差2个字符,相当于等差为2
    int s,n;//s记录给的字符数量,n记录一半沙漏(一个等差)的层(项)数
    char c;//c记录给的字符
    cin>>s>>c;//输入数量,字符
    n=sqrt((s+1)/2);//由等差数列的前n项和推导出来
    //等差数列前n项和公式为:s=n*a1+n*(n-1)*d/2
    //需要输出的沙漏由两个等差组成,其中一个等差缺少第一项
    //由上可确定公式为:s=2*(n*a1+n*(n-1)*d/2)-1
    //由图可知第一项(第一层)a1=1,等差(即每一层相差数)为2
    //带入a1和d可推出s=2*(n*1+n^2-n)*2/2)-1
    //移项可得(s+1)/2=n^2
    //得n=sqrt((s+1)/2),sqrt为头文件cmath下的求根函数
    for(int i=n;i>0;i--){//上面的三角形是从第n项开始输出
        for(int j=0;j<n-i;j++) cout<<' ';//i动态减一,空格数动态加一
        for(int j=0;j<2*i-1;j++) cout<<c;//由等差数列第n项推导出来
        //等差数列第n项公式为an=ai+(n-1)d,代入a1和d
        //简化为an=1+2*n-2;
        //an=2*n-1
        cout<<endl;
    }
    for(int i=2;i<=n;i++){//与上三角推导过程一样,从第2项开始输出即可
        for(int j=0;j<n-i;j++) cout<<' ';
        for(int j=0;j<2*i-1;j++) cout<<c;
        cout<<endl;
    }
    cout<<s-2*n*n+1;//由第16行简化得到
    return 0;
}



5、3375:【例65.1】 循环比赛

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
1325:【例7.4】 循环比赛日程表--AC
http://ybt.ssoier.cn:8088/problem_show.php?pid=1325
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<string>
#define INF 999999999
#define N 1001
#define MOD 1000000007
using namespace std;
int a[N][N];
int main( void )
{
    int m;
    int k=1,half=1;
    cin>>m;
 
    int n=1<<m;
    a[0][0]=1;
    while(k<=m)
    {
        //构造右上方方阵
		for(int i=0;i<half;i++)
            for(int j=0;j<half;j++)
                a[i][j+half]=a[i][j]+half;
 
        //对称交换构造下半部分方阵
		for(int i=0;i<half;i++)
        for(int j=0;j<half;j++)
        {
            a[i+half][j]=a[i][j+half];
            a[i+half][j+half]=a[i][j];
        }
        
        half*=2;
        k++;
    }
    
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            printf("%d ",a[i][j]);
        cout<<endl;
    }
    
    return 0;
}



6、3376:【例65.2】 清除地雷

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3376:【例65.2】 清除地雷
http://bas.ssoier.cn:8086/problem_show.php?pid=3376

计蒜客信息学 6 月编程新赛 D题
https://blog.csdn.net/qq_51687579/article/details/119106145
*/
#include<bits/stdc++.h>
using namespace std;
char a[105][105];  //字符数组 储存地图 
int n,m;
void fun(int x,int y)  //递归函数 
{
	a[x][y]='2';      //字符换为2表示已经引爆 
	int up=max(x-1,1),down=min(x+1,n);   //确定上下位置 
	int l=max(y-1,1),r=min(y+1,m);      //确定左右位置 
	for(int i=up;i<=down;i++)
	{
		for(int j=l;j<=r;j++)
		{
			if(x==i&&y==j)   //遍历到自身位置跳过 
			continue;
		
			if(a[i][j]=='1')
			{
				fun(i,j);
			}
			else
			{
				a[i][j]='2';
			}
		}
	}
} 
int main()
{

	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	int x,y;
	
	cin>>x>>y;
	if(a[x][y]=='0')  //判断0或1  如果为0则原样输出 
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cout<<a[i][j];
			}
			cout<<endl;
		}
	}
	else   //可以引爆 
	{
		fun(x,y);     //递归函数 
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cout<<a[i][j];
			}
			cout<<endl;
		}		
	}
	return 0;
}



7、3377:【例65.3】 细胞个数

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3377:【例65.3】 细胞个数
http://bas.ssoier.cn:8086/problem_show.php?pid=3377
https://blog.csdn.net/weixin_45830165/article/details/109384919
*/
#include<bits/stdc++.h>
using namespace std;
int g[105][105];
int n,m,sum=0;
bool used[105][105];//标记数组
int dx[]={0,0,1,-1};//方向数组
int dy[]={1,-1,0,0};
//判断边界或是否被标记过
bool check(int a,int b)
{
    if(a<1||a>n||b<1||b>m||g[a][b]==0||used[a][b]==false)
        return false;
    else 
        return true;
}
//深搜
void dfs(int a,int b)
{
    used[a][b]=false;
    for(int i=0;i<4;i++)
    {
        int tx,ty;
        tx=a+dx[i];ty=b+dy[i];
        if(!check(tx,ty))
            continue;  
        dfs(tx,ty);
        used[tx][ty]=false;
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%1d",&g[i][j]);//有两种输入方法,当用char定义g[i][j]时,用cin>>g[i][j];用int定义g[i][j]时,用scanf("%1d",&g[i][j]);来控制输入的个数
            used[i][j]=true;
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g[i][j]!=0&&used[i][j])
            {
                dfs(i,j);
                sum++;
            }
        }
        cout<<sum<<endl;
    return 0;
}



8、3378:练65.1 水洼个数

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
3378:练65.1 水洼个数
http://bas.ssoier.cn:8086/problem_show.php?pid=3378
https://blog.csdn.net/2201_75926509/article/details/131795662
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
char ch[114][114];
void search(int i,int j)
{
	ch[i][j]='.';
	if(ch[i-1][j]=='W')search(i-1,j); 
	if(ch[i-1][j-1]=='W')search(i-1,j-1); 
	if(ch[i-1][j+1]=='W')search(i-1,j+1); 
	if(ch[i][j-1]=='W')search(i,j-1);
	if(ch[i][j+1]=='W')search(i,j+1); 
	if(ch[i+1][j]=='W')search(i+1,j); 
	if(ch[i+1][j-1]=='W')search(i+1,j-1); 
	if(ch[i+1][j+1]=='W')search(i+1,j+1);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	  cin>>ch[i][j];
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	 {
	 	if(ch[i][j]=='W')
	 	{
	 		search(i,j);
	 		ans++;
	 	}
	 }  
	 cout<<ans;
	 return 0;
}



9、3379:练65.2 跳房子

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

练 65.2 跳房子

1417:【17NOIP普及组】跳房子

信息学奥赛一本通(C++版)在线评测系统

1247:河中跳房子

信息学奥赛一本通(C++版)在线评测系统

信息学竞赛NOIP试题讲解 跳房子(2017-PJ-T4)

信息学竞赛NOIP试题讲解 跳房子(2017-PJ-T4)_哔哩哔哩_bilibili

Noip2017 普及组第四题 跳房子

Noip2017 普及组第四题 跳房子_哔哩哔哩_bilibili

T4 跳房子_哔哩哔哩_bilibili

[NOIP2017 普及组] 跳房子_哔哩哔哩_bilibili

蓝桥杯青少组python跳房子讲解_哔哩哔哩_bilibili

/*
3379:练65.2 跳房子
http://bas.ssoier.cn:8086/problem_show.php?pid=3379
https://blog.csdn.net/2201_75926509/article/details/131938693
*/
#include<bits/stdc++.h>
using namespace std;
int ans;
char ch[6][6];
map<string,bool>f;
int dx[]={0,1, 0,-1};
int dy[]={1,0,-1,0 };
void search(int x,int y,int step,string s)
{
	s=s+ch[x][y];
	if(step==6)
	{
		if(f.count(s)==0)
		  f[s]=1,ans++;
		return;  
	}
	for(int i=0;i<=3;i++)
	{
		int px=x+dx[i];
		int py=y+dy[i];
		if(px>=1 && px<=5 && py>=1 && py<=5)
		search(px,py,step+1,s);
	}
}
int main()
{
	for(int i=1;i<=5;i++)
	 for(int j=1;j<=5;j++)
	   cin>>ch[i][j];
	for(int i=1;i<=5;i++)
	 for(int j=1;j<=5;j++)
	   search(i,j,1,"");
	cout<<ans;
	return 0;   
	   
}



10、3380:练65.3  螺旋矩阵

信息学奥赛一本通-编程启蒙(C++版)在线评测系统

/*
P2239 螺旋矩阵
https://www.luogu.com.cn/problem/P2239

1967:【14NOIP普及组】螺旋矩阵-AC
http://ybt.ssoier.cn:8088/problem_show.php?pid=1967
*/
#include<bits/stdc++.h>
#define R register 
using namespace std;
//快读 
inline void in(int &x) 
{
    int f=1;x=0;char s=getchar();
    while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    x*=f;
}
int n,x,y,ans;
int main( void )
{
    in(n),in(x),in(y);
    //如果刚开始的话x,y就满足四条规律.
    //我们会在第一次输出答案,此时ans为0,无影响.
    here:;
    if( x == 1 )printf("%d",y+ans);
    else if( y == n ) printf("%d",n+x-1+ans);
    else if( x == n ) printf("%d",3*n-y-1+ans);
    else if( y == 1 ) printf("%d",4*n-x-2+ans);
    else
    {
        ans+=4*n-4;
        x--,y--,n-=2;
        goto here;
        //这句话达到了递归的效果。
        //我们的程序运行到这一步会到达上面的here,即再度执行这些if语句.
    }
}





 




信息学奥赛一本通 编程启蒙C++版》3001 -- 3020

《信息学奥赛一本通 编程启蒙C++版》3001 -- 3020-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3001-3030

《信息学奥赛一本通 编程启蒙C++版》3001-3030-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3031-3099

《信息学奥赛一本通 编程启蒙C++版》3031-3099-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3390-3395、3451-3465

《信息学奥赛一本通 编程启蒙C++版》3390-3395、3451-3465-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3021 -- 3040

《信息学奥赛一本通 编程启蒙C++版》3021 -- 3040-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3041 -- 3060

《信息学奥赛一本通 编程启蒙C++版》3041 -- 3060-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3061 -- 3080

《信息学奥赛一本通 编程启蒙C++版》3061 -- 3080-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3081 -- 3100

《信息学奥赛一本通 编程启蒙C++版》3081 -- 3100-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3101 -- 3120

《信息学奥赛一本通 编程启蒙C++版》3101 -- 3120-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3100-3154

《信息学奥赛一本通 编程启蒙C++版》3100-3154-CSDN博客

《信息学奥赛一本通 编程启蒙C++版》3451 -- 3466

《信息学奥赛一本通 编程启蒙C++版》3451 -- 3466-CSDN博客

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值