模拟火车的行为有些困难。
所以尝试找到所有可能的排列情况,然后判断其中可能的情况。
首先是生成全排列的函数
/* 生成全排列 返回个数*/
char all_str[1000][100];
void swap(char*str, int src, int dst)
{
char temp;
temp = str[src];
str[src] = str[dst];
str[dst] = temp;
}
int cnt_sort = 0;
void sort(int loc, char* str, int level)
{
int i;
if(level == loc){
strcpy(all_str[cnt_sort], str);
cnt_sort ++;
return;
}
sort(loc, str, level + 1);
for(i = 0; i+level < loc; i++){
swap(str, level + i, level - 1);
sort(loc, str, level + 1);
}
for(i = loc - level - 1; i>= 0;i--)
swap(str, level+i, level - 1);
}
int All_Sort(int n, char str[100])
{
sort(n, str, 1);
return cnt_sort;
}
生成的所有排列情况保存在all_str中
然后是判断函数
int TestIsSeq(int n, Stack *stk, char str1[100], char str2[100])
{
int x=0, y=0;
int flag = 1;
stk->top = -1;
while(y < n)
{
if(str1[x] == str2[y])
{
x++;
y++;
}
else if(stk->top>=0 && stk->stack[stk->top] == str2[y])
{
stk->top--;
y++;
}
else if(x < n)
{
stk->stack[++stk->top] = str1[x];
x++;
}
else
{
flag = 0;
break;
}
}
printf("%s\n",flag?"Yes":"No");
return flag;
}
比较复杂,但是可行
全部代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int top;
char *stack;
}Stack;
/* 判断str2是否是一种出站顺序 */
int TestIsSeq(int n, Stack *stk, char str1[100], char str2[100]);
/* 生成全排列 返回个数*/
char all_str[100][100];
void swap(char*hash, int src, int dst)
{
char temp;
temp = hash[src];
hash[src] = hash[dst];
hash[dst] = temp;
}
int cnt_sort = 0;
void sort(int loc, char* str, int level)
{
int i;
if(level == loc){
strcpy(all_str[cnt_sort], str);
cnt_sort ++;
return;
}
sort(loc, str, level + 1);
for(i = 0; i+level < loc; i++){
swap(str, level + i, level - 1);
sort(loc, str, level + 1);
}
for(i = loc - level - 1; i>= 0;i--)
swap(str, level+i, level - 1);
}
int All_Sort(int n, char str[100]);
int main(int argc, const char ** argv)
{
int n;
scanf("%d",&n);
char *stack;
stack = (char*)malloc(sizeof(char)*n);
Stack stk;
stk.stack = stack;
stk.top = -1;
char pre_str[100];
scanf("%s", pre_str);
int num = All_Sort(n, pre_str);
int cnt=0;
while( (--num)> -1){
cnt += TestIsSeq(n, &stk, pre_str, all_str[num]);
}
printf("一共有%d种\n",cnt);
scanf("%d");
}
int TestIsSeq(int n, Stack *stk, char str1[100], char str2[100])
{
int x=0, y=0;
int flag = 1;
stk->top = -1;
while(y < n)
{
if(str1[x] == str2[y])
{
x++;
y++;
}
else if(stk->top>=0 && stk->stack[stk->top] == str2[y])
{
stk->top--;
y++;
}
else if(x < n)
{
stk->stack[++stk->top] = str1[x];
x++;
}
else
{
flag = 0;
break;
}
}
printf("%s\n",flag?"Yes":"No");
return flag;
}
int All_Sort(int n, char str[100])
{
sort(n, str, 1);
return cnt_sort;
}