B - 排序
輸入一行數字,如果我們把這行數字中的‘5’都看成空格,那麼就得到一行用空格分割的若干非負整數(可能有些整數以‘0’開頭,這些頭部的‘0’應該被忽略掉,除非這個整數就是由若干個‘0’組成的,這時這個整數就是0)。
你的任務是:對這些分割得到的整數,依從小到大的順序排序輸出。
Input
輸入包含多組測試用例,每組輸入數據只有一行數字(數字之間沒有空格),這行數字的長度不大於1000。
輸入數據保證:分割得到的非負整數不會大於100000000;輸入數據不可能全由‘5’組成。
Output
對於每個測試用例,輸出分割得到的整數排序的結果,相鄰的兩個整數之間用一個空格分開,每組輸出佔一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
#include"bits/stdc++.h"
typedef long long ll;
using namespace std;
int main() {
char s[5005];
int a[5005];
int i,len,k,n;
while(scanf("%s",s)!=EOF) {
n=0;
k=0;
len=strlen(s);
s[len]='5';
i=0;
while(s[i++]=='5'); //跳過前綴5,防止多輸出0
for(i--; i<=len; ++i) {
if(i>0&&s[i]=='5'&&s[i-1]=='5') //忽略連續的5,防止多輸出0
continue;
if(s[i]!='5')
k=k*10+s[i]-'0';
else { //遇到5就增加一個數
a[n++]=k;
k=0;
}
}
sort(a,a+n);
printf("%d",a[0]);
for(i=1; i<n; ++i)
printf(" %d",a[i]);
printf("\n");
}
return 0;
}
/*
0051231232050775
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>
#include<ctype.h>
#include<windows.h>
#include<time.h>
#define TURE 1
#define FLASE 0
#define ERROR 0
#define OVERFLOW -2
#define OK 1
#define INFLASEBLE -1
#define MaxSize 2510
#define Size 50
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType i;
ElemType j;
ElemType pre;
} LNode;
typedef struct {
LNode data[MaxSize];
LNode *front,*rear;
} SqQueue;
Status InitQueue(SqQueue *Q) { //建立隊列,使front,rear都指向基準
Q->front=Q->data;
Q->rear=Q->data;
Q->front->pre=0;
return OK;
}
Status EnQueue(SqQueue *Q,ElemType x,ElemType y) {//座標進隊列
Q->rear->i=x;
Q->rear->j=y;
Q->rear++;
Q->rear->pre=(Q->rear-1)->pre+1;
return OK;
}
Status QueueEmpty(SqQueue Q) { //判斷隊列是否爲空
if(Q.front==Q.rear) return FLASE;
else return TURE;
}
//以上爲隊列
typedef struct {
ElemType data[Size];
ElemType *top;
} SqStack;
Status InitStack(SqStack *S) {//使top的指針指向空
S->top=NULL;
return OK;
}
Status Push(SqStack *S,ElemType e) {//使棧頂的元素爲e
if(S->top==NULL)
S->top=S->data;
else S->top++;
*(S->top)=e;
return OK;
}
ElemType Pop(SqStack *S,ElemType *e) { //使棧頂的元素出棧,且返回值爲e
*e=*(S->top);
S->top--;
return *e;
}
//以上爲棧
Status PrintMigong(ElemType (*MAZE)[Size],ElemType m,ElemType n) {//打印迷宮
ElemType i,j;
printf("迷宮如下:\n");
for(j=0; j<n+2; j++) {
for(i=0; i<m+2; i++) {
if(j==0) printf("%d ",i);
else if(i==0) printf("%d",-j);
else if(MAZE[i][j]==0) printf("□",MAZE[i][j]);
else printf("■",MAZE[i][j]);
}
printf("\n");
}
return OK;
}
Status CreatMigong(ElemType (*MAZE)[Size],ElemType (*MARK)[Size],ElemType m,ElemType n) { //構造迷宮
srand(time(NULL));
ElemType i,j;
for(i=0; i<m+2; i++)
for(j=0; j<n+2; j++) {
if(i==0||i==m+1||j==0||j==n+1) MAZE[i][j]=1;//建立圍牆
else MAZE[i][j]=rand()%2;//給迷宮的內部賦予隨機數0或1
}
MAZE[1][1]=0,MAZE[m][n]=0;
MARK[1][1]=1;//標記第一個點已經走
return OK;
}
Status PrintPath(SqStack S,SqQueue Q,ElemType n) {//打印最短路徑
ElemType l,e;
for(l=0; l<n-1; l++) {
Pop(&S,&e);
printf("(%-2d,%-2d) -> ",Q.data[e].i,-Q.data[e].j);
}
Pop(&S,&e);
printf("(%-2d,%-2d)",Q.data[e].i,-Q.data[e].j);
return OK;
}
Status Sloution() {//找最短路徑
ElemType k,flag=0;
ElemType nexti=1,nextj=1;
SqQueue Q;
LNode *t;
SqStack S;
InitQueue(&Q);
InitStack(&S);
ElemType Direction[8][2]= {{1,1},{0,1},{1,0},{-1,1},{1,-1},{0,-1},{-1,0},{-1,-1}};
//用二維數組Direction存放八個方向上的位置偏移量
ElemType m,n;
do{
printf("請輸入迷宮的行和列:");
scanf("%d%d",&m,&n);//輸入迷宮的行和列
}while(m<1&&n<1||m>=50||n>=50);
ElemType MAZE[Size][Size]= {0}; //建立一個數組用於容納迷宮
ElemType MARK[Size][Size]= {0}; //建立一個標記是否走過的數組
CreatMigong(MAZE,MARK,m,n);
PrintMigong(MAZE,m,n);
EnQueue(&Q,1,1);
while(QueueEmpty(Q)) {
for(k=0; k<8; k++) {//判斷八個方向是否有可以走的,有就壓進隊列
nexti=Q.rear->i+Direction[k][0],nextj=Q.rear->j+Direction[k][1];
if(MAZE[nexti][nextj]||MARK[nexti][nextj]);
else {
MARK[nexti][nextj]=1;
EnQueue(&Q,nexti,nextj);
//printf("%d ",Q.rear->pre);
if(nexti==m&&nextj==n) { //一旦發現了出口,就退出循環
flag=1;
break;
}
}
}
if(flag==1) {//如果找到出口就壓進棧中
t=Q.rear;
t--;
while(t->pre) {
//printf("%d ",t->pre);
Push(&S,t->pre);
t--;
}
break;
}
}
printf("走出迷宮最短路經如下:\n");
if(QueueEmpty(Q)) {//如果不是因爲隊列退出循環的,就把棧中的元素輸出
PrintPath(S,Q,(Q.rear-1)->pre);
} else printf("No path!\n");
return OK;
}
int main() {
while(1) {
Sloution();
}
return 0;
}