B - 排序

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章