这几天比较忙,写的比较少,直接开始。
传送门
P-0005 清除类游戏
#include<stdio.h>
int main(){
int n,m;
scanf("%d%d",&n,&m);
int nums[30][30]={0};
int rowsame[30][30]={0};//第0列是nums第一行中连续三个相同的列标
int columnsame[30][30]={0};
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&nums[i][j]);
}
}
//按行查找相同,rowsame的每一列存着nums每一行相同的数的列标
for(int i=0;i<n;i++){
for(int j=0;j<m-1;j++){
if(nums[i][j]==nums[i][j+1]&&nums[i][j]==nums[i][j+2]){
rowsame[j][i]=1;
rowsame[j+1][i]=1;
rowsame[j+2][i]=1;
}
}
}
//按列查找相同
for(int i=0;i<n;i++){
for(int j=0;j<m-1;j++){
if(nums[j][i]==nums[j+1][i]&&nums[j][i]==nums[j+2][i]){
columnsame[j][i]=1;
columnsame[j+1][i]=1;
columnsame[j+2][i]=1;
}
}
}
//按行按列分别清零
for(int i=0;i<30;i++){
for(int j=0;j<30;j++){
if(rowsame[i][j]!=0){
nums[j][i]=0;
}
}
}
for(int i=0;i<30;i++){
for(int j=0;j<30;j++){
if(columnsame[i][j]!=0){
nums[i][j]=0;
}
}
}
//输出
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d ",nums[i][j]);
}
printf("\n");
}
return 0;
}
P-0006 数字排序
//xdoj0006.c
#include<stdio.h>
void swap(int *a,int *b){
int c;
c=*a;
*a=*b;
*b=c;
}
int main(){
int n,t,sum=0;
scanf("%d",&n);
int nums[2][1000]={0};
//输入
for(int i=0;i<n;i++){
scanf("%d",&nums[0][i]);
}
//计算各位数字之和
for(int i=0;i<n;i++){
sum=0;
t=nums[0][i];
while(t!=0){
sum=sum+t%10;
t/=10;
}
nums[1][i]=sum;
}
//各位数之和从小到大排序
int i,j,min;
for(i=0;i<n-1;i++){
for(j=i+1,min=i;j<n;j++){
if(nums[1][min]>nums[1][j]){
min=j;
}else if(nums[1][min]==nums[1][j]){//如果相同,按照从小到大的顺序排序
if(nums[0][min]<nums[0][j]){
swap(&nums[1][j],&nums[1][min]);
swap(&nums[0][j],&nums[0][min]);
}
}
}
if(i!=min){
swap(&nums[1][i],&nums[1][min]);
swap(&nums[0][i],&nums[0][min]);
}
}
//输出
for(i=n-1;i>=0;i--){
printf("%d %d\n",nums[0][i],nums[1][i]);
}
return 0;
}
P-0036 矩阵
//xdoj0036.c
#include<stdio.h>
void InsertionSort(int a[],int length){
int i,j,t;
// 1.从第一个元素开始依次取出所有用于比较元素
for (i=1;i<length;i++){
// 2.遍历取出前面元素进行比较
for(j=i;j>0;j--){
// 3.如果前面一个元素大于当前元素,就交换位置
if(a[j-1]>a[j]){
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}else{
break;
}
}
}
}
int main(){
int m;
scanf("%d",&m);
int arr[20][20];
int ans[402];//总共有m*m+2个
int sum=0;
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
scanf("%d",&arr[i][j]);
}
}
//求每行
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
sum+=arr[i][j];
}
ans[i]=sum;
sum=0;
}
sum=0;
//求每列
int t=m;
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
sum+=arr[j][i];
}
ans[t++]=sum;
sum=0;
}
sum=0;
//求主对角线
for(int i=0;i<m;i++){
sum+=arr[i][i];
}
ans[t]=sum;
//求副对角线
sum=0;
for(int i=m-1;i>=0;i--){
sum+=arr[m-i-1][i];
}
ans[t+1]=sum;
//排序
InsertionSort(ans,t+2);
//输出
for(int i=t+1;i>=0;i--){
printf("%d ",ans[i]);
}
return 0;
}
P-0037 排序2
//xdoj0037.c
#include<stdio.h>
void InsertionSort(int a[],int length){
int i,j,t;
// 1.从第一个元素开始依次取出所有用于比较元素
for (i=1;i<length;i++){
// 2.遍历取出前面元素进行比较
for(j=i;j>0;j--){
// 3.如果前面一个元素小于当前元素,就交换位置
if(a[j-1]<a[j]){
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}else{
break;
}
}
}
}
int main(){
int n;
scanf("%d",&n);
int t;
int evenarr[100];
int oddarr[100];
int k=0,v=0;
for(int i=0;i<n;i++){
scanf("%d",&t);
if(t%2==0){//偶数
evenarr[k++]=t;
}else{
oddarr[v++]=t;
}
}
InsertionSort(evenarr,k);
InsertionSort(oddarr,v);
for(int i=0;i<k;i++){
printf("%d ",evenarr[i]);
}
for(int i=0;i<v;i++){
printf("%d ",oddarr[i]);
}
return 0;
}
P-0038 回文数
//xdoj0038.c
#include<stdio.h>
#include<string.h>
int main(){
char n[10000]={'\0'};//根本不需要10 0000 0000哈哈
scanf("%s",&n);
int len=strlen(n);
int flag=1;
for(int i=0;i<=len/2;i++){
if(n[i]!=n[len-i-1]){
flag=0;
}
}
int sum=0;
if(flag){
for(int i=0;i<len;i++){
sum+=(int)n[i]-48;
}
printf("%d",sum);
}else{
printf("no");
}
return 0;
}
P-0039 马鞍点
//xdoj0039.c
#include<stdio.h>
int main(){
int m,n,flag=0;
scanf("%d%d",&m,&n);
int nums[100][100];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&nums[i][j]);
}
}
int max[100],min[100];
int i,j;
for(i=0;i<m;i++){
min[i]=nums[i][0];
for(j=1;j<n;j++){
if(nums[i][j]<min[i]) min[i]=nums[i][j];
}
}
for(j=0;j<n;j++){
max[j]=nums[0][j];
for(i=1;i<m;i++){
if(nums[i][j]>max[j]){
max[j]=nums[i][j];
}
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(nums[i][j]==max[j]&&nums[i][j]==min[i]){
printf("%d %d %d",i,j,nums[i][j]);
flag=1;
}
}
}
if(flag==0){
printf("no");
}
return 0;
}
P-0040 等差数列
//xdoj0040.c
#include<stdio.h>
void InsertionSort(int a[],int length){
int i,j,t;
// 1.从第一个元素开始依次取出所有用于比较元素
for (i=1;i<length;i++){
// 2.遍历取出前面元素进行比较
for(j=i;j>0;j--){
// 3.如果前面一个元素大于当前元素,就交换位置
if(a[j-1]>a[j]){
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}else{
break;
}
}
}
}
int main(){
int nums[100],n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&nums[i]);
}
InsertionSort(nums,n);
int d=nums[1]-nums[0];
int t,flag=0;
for(int i=2;i<n;i++){
t=nums[i]-nums[i-1];
if(t==d){
flag=1;
}else{
flag=0;
}
}
if(flag){
printf("%d",d);
}else{
printf("no");
}
return 0;
}
P-0067 查找
(也可以先排序再二分查找)
//xdoj0067.c
#include<stdio.h>
int main(){
int n,target;
scanf("%d%d",&n,&target);
int nums[100];
int flag=0;
for(int i=0;i<n;i++){
scanf("%d",&nums[i]);
if(nums[i]==target){
printf("%d ",i);
flag=1;
}
}
if(flag==0){
printf("-1");
}
return 0;
}
P-0069 0-1矩阵
//xdoj0069.c
#include<stdio.h>
int main(){
int m,n;
scanf("%d%d",&m,&n);
int nums[100][100]={0};//越界部分是0,便于判断
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&nums[i][j]);
}
}
int count=0;
int flag,max,index;
for(int i=0;i<m;i++){
flag=0;
count=0;
index=0;
max=0;
for(int j=0;j<=n;j++){//必须要让j<=n,越界后才会出现0,否则全是1的情况出错
if(nums[i][j]==1){
count++;
flag=1;//非全零
}else{
if(count>max){
max=count;
index=j-1;//索引j的上一个数就是1,当前j是0
}
count=0;
}
}
if(flag){
printf("%d %d\n",index-max+1,index);
}else{//全是零
printf("-1 -1\n");
}
}
return 0;
}
`
P-0070 Z字形扫描
//xdoj0070.c
#include<stdio.h>
void ZigzagScan(int nums[100][100],int n){
int i,j;//总共n*n个数,2*n-1个斜线 操作2n-1次,i是行,j是列
int count;//总共要扫描2n-1次,分成俩个部分 n 和 n-1
int total=2*n-1;
for(count=1;count<=total;count++){//扫描前半部分的n组斜线
if(count%2==0){//偶数,斜线的起点行号是0 从右上到左下
for(i=0;count-1-i!=-1;i++){
if(nums[i][count-1-i]!=1001){//越界bbu分是1001
printf("%d ",nums[i][count-1-i]);//行列标相加是count-1
}
}
}else{//奇数,斜线的起点列号是0 从左下到右上
for(j=0;count-1-j!=-1;j++){
if(nums[count-1-j][j]!=1001){//越界bbu分是1001
printf("%d ",nums[count-1-j][j]);//行列标相加是count-1
}
}
}
}
}
int main(){
int n;
scanf("%d",&n);
int nums[100][100];
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
nums[i][j]=1001;//最多是1000,设为1001便于判断
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&nums[i][j]);
}
}
ZigzagScan(nums,n);
return 0;
}
(大概思路)
P-0165 最值位置
//xdoj0165.c
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int max=-9999;
int nums[80];
int t;
for(int i=0;i<n;i++){
scanf("%d",&nums[i]);
if(nums[i]>=max){
max=nums[i];
t=i;
}
}
printf("%d %d %d",n,max,t);
return 0;
}
最后
感兴趣的可以关注我的微信公众号,第一时间收到动态