1、3371:【例64.2】 生日相同
/*
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 图像旋转
/*
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 图像旋转翻转变换
#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 打印沙漏
/*
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】 循环比赛
/*
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】 清除地雷
/*
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】 细胞个数
/*
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 水洼个数
/*
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 跳房子
练 65.2 跳房子
1417:【17NOIP普及组】跳房子
1247:河中跳房子
信息学竞赛NOIP试题讲解 跳房子(2017-PJ-T4)
Noip2017 普及组第四题 跳房子
Noip2017 普及组第四题 跳房子_哔哩哔哩_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 螺旋矩阵
/*
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-3030
《信息学奥赛一本通 编程启蒙C++版》3031-3099
《信息学奥赛一本通 编程启蒙C++版》3390-3395、3451-3465
《信息学奥赛一本通 编程启蒙C++版》3021 -- 3040
《信息学奥赛一本通 编程启蒙C++版》3041 -- 3060
《信息学奥赛一本通 编程启蒙C++版》3061 -- 3080
《信息学奥赛一本通 编程启蒙C++版》3081 -- 3100
《信息学奥赛一本通 编程启蒙C++版》3101 -- 3120
《信息学奥赛一本通 编程启蒙C++版》3100-3154
《信息学奥赛一本通 编程启蒙C++版》3451 -- 3466
《信息学奥赛一本通 编程启蒙C++版》3451 -- 3466-CSDN博客