系统不给判题的,代码为个人练手,不保正确
A:点排序
描述
给定一个点的坐标(x, y),在输入的n个点中,依次计算这些点到指定点的距离,并按照距离进行从小到大排序,并且输出点的坐标(如果距离相同,将x轴坐标比较小的点排到前面, 如果距离相等且x轴坐标也相同,则将y轴坐标较小的点排到前面)。坐标为int类型,范围为-1000到1000。n 为1到100之间正整数。
输入
3行,第一行为指定点的坐标x, y。x, y之间用空格隔开。第二行为一个整数n。第三行为n个点的坐标,彼此之间用空格间隔。
输出
按照距离进行从小到大排序,输出点的坐标(如果距离相同,将x轴坐标比较小的点排到前面,如果距离相等且x轴坐标也相同,则将y轴坐标较小的点排到前面)。注意输出中同一个点内部括号中无空格,点和点之间逗号后面存在空格。
样例输入
0 0
5
1 0 0 1 1 1 5 2 4 0
样例输出
(0,1), (1,0), (1,1), (4,0), (5,2)
我把输入的第一行那个点设为原点x0,y0
设置一个结构体,包含点的横坐标、纵坐标、距离原点距离的平方(反正是比较大小,就没开方)
用sort排序 int cmp()中是排序规则
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
double x,y;
double dis;
}p[105];
int cmp(node a,node b)
{
if (a.dis==b.dis)
{
if (a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
return a.dis<b.dis;
}
int main()
{
double x0,y0;
int n;
while(cin>>x0>>y0)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i].x>>p[i].y;
p[i].dis=(p[i].x-x0)*(p[i].x-x0)+(p[i].y-y0)*(p[i].x-x0);
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i-1)cout<<", ";
cout<<"("<<p[i].x<<","<<p[i].y<<")";
}
}
}
B:单词倒排
描述
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
输入
输入为一个字符串(字符串长度至多为100)。
输出
输出为按要求排序后的字符串。
样例输入
I am a student
样例输出
student a am I
没遇到空格时存起来,遇到空格输出来
#include "stdio.h"
#include<string.h>
int main()
{
char s[200],t[20];
while( gets(s))
{
int cc=0;
for(int i=strlen(s)-1; i>=0; i--)
{
if (s[i]!=' ')
{
t[cc]=s[i];
cc++;
}
if (s[i]==' '||!i)
{
for(int j=cc-1; j>=0; j--)
printf("%c",t[j]);
if (i)printf(" ");
else printf("\n");
cc=0;
}
}
}
}
C:生存游戏
描述
有如下生存游戏的规则:
给定一个n*m(1<=n,m<=100)的数组,每个元素代表一个细胞,其初始状态为活着(1)或死去(0)。
每个细胞会与其相邻的8个邻居(除数组边缘的细胞)进行交互,并遵守如下规则:
任何一个活着的细胞如果只有小于2个活着的邻居,那它就会由于人口稀少死去。
任何一个活着的细胞如果有2个或者3个活着的邻居,就可以继续活下去。
任何一个活着的细胞如果有超过3个活着的邻居,那它就会由于人口拥挤而死去。
任何一个死去的细胞如果有恰好3个活着的邻居,那它就会由于繁殖而重新变成活着的状态。
请写一个函数用来计算所给定初始状态的细胞经过一次更新后的状态是什么。
注意:所有细胞的状态必须同时更新,不能使用更新后的状态作为其他细胞的邻居状态来进行计算。
输入
第一行为n和m,而后n行,每行m个元素,用空格隔开。
输出
n行,每行m个元素,用空格隔开。
样例输入
3 4
0 0 1 1
1 1 0 0
1 1 0 1
样例输出
0 1 1 0
1 0 0 1
1 1 1 0
#include<iostream>
#include<stdio.h>
using namespace std;
int n,m,c[105][105],d[105][105];
int nn(int a,int b)
{
int t=0;
for(int i=-1; i<=1; i++)
for(int j=-1; j<=1; j++)
{
if (a+i&&b+j&&a+i<=n&&b+j<=m&&c[a+i][b+j]&&(i||j))
t++;
}
return t;
}
int main()
{
while(cin>>n>>m)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>c[i][j];
d[i][j]=c[i][j];
}
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(c[i][j]&&(nn(i,j)<2||nn(i,j)>3))d[i][j]=0;
else if (!c[i][j]&&nn(i,j)==3)d[i][j]=1;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if (j>1)cout<<" ";
//cout<<nn(i,j);
cout<<d[i][j];
}
printf("\n");
}
}
}
D:特殊密码锁
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011
000
样例输出
1
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s,t,ss;
while(cin>>s>>ss)
{
int tmp=0,ans=1e8,l;
t=s;
l=s.length();
for(int i=1; i<l; i++)
if(s[i-1]!=ss[i-1])
{
s[i-1]=s[i-1]=='1'?'0':'1';
s[i]=s[i]=='1'?'0':'1';
if(i+1<l) s[i+1]=s[i+1]=='1'?'0':'1';
tmp++;
}
if(s[l-1]==ss[l-1]) ans=tmp;
s=t;
s[0]=s[0]=='1'?'0':'1';
s[1]=s[1]=='1'?'0':'1';
tmp=1;
for(int i=1; i<l; i++)
if(s[i-1]!=ss[i-1])
{
s[i-1]=s[i-1]=='1'?'0':'1';
s[i]=s[i]=='1'?'0':'1';
if(i+1<l) s[i+1]=s[i+1]=='1'?'0':'1';
tmp++;
}
if(s[l-1]==ss[l-1]) ans=min(ans,tmp);
if(ans==1e8) cout<<"impossible";
else cout<<ans<<endl;
}
return 0;
}