题目太长了不说了 (只需要修改reverse函数和swap函数)
如下 一个是reverse 一个是swap
reverse要求把in[sp]一直到in[ep-1]的排列顺序调转
swap要求把in[0]到in[sp-1]为止的整体排列与in[sp]到in[ep-1]为止的整体排列换位
我自己写的输出结果不对
要求结果
<例1>
输入
3
001
12345
0000
输出
3
18
1
<例2>
输入
2
012
1234
输出
6
12
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int item;
typedef struct node *link;
#define MAX_LEN 100
#define MAX_RESULTS 1000
struct node
{
char *p;
link next;
};
link NEW(char *inp,link next)
{
link x=malloc(sizeof(*x));
x->p=inp;
x->next=next;
return x;
}
void reverse(int sp,int ep,char*in)
{
int i;
char temp;
for(i=0;i<ep-sp+1;i++){
temp=in[sp+i];
in[sp+i]=in[ep-(i+1)];
in[ep-(i+1)]=temp;
}
//reverse in[sp]...in[ep-1]
}
void swap(int sp,int ep,char *in)
{
int i,j,k;
char temp[101];
char box1[101];
char box2[101];
for(i=0;i<sp;i++){
temp[i]=in[i];
}
for(j=0;j<ep-sp+1;j++){
box1[j]=in[sp+j];
}
for(k=0;k<sp;k++){
box2[k]=temp[k];
}
in=strcat(box1,box2);
//swap in[0]~in[sp-1] by in[sp]~in[ep-1]
}
int chk_isnew(char *in,link *p_head)
{
link t=*p_head;
while(t!=NULL)
{
if(strcmp(t->p,in)==0) return 0;
else t=t->next;
//implement
//return 0 if t->p is equal to in
//next node otherwise
}
char *store=(char *)malloc(sizeof(char)*MAX_LEN);
memcpy(store,in,sizeof(char)*MAX_LEN);
*p_head=NEW(store,*p_head);
return(1);
}
int main(void)
{
link head;
int num,cnt,i;
scanf("%d",&num);
int *result=(int *)malloc(sizeof(int)*MAX_RESULTS);
char *dish;
char *tmp_dish;
for(cnt=0; cnt<num; cnt++)
{
result[cnt]=0;
head=NULL;
dish=(char *)malloc(sizeof(char)*MAX_LEN);
memset(dish,0x00,sizeof(char)*MAX_LEN);
tmp_dish=(char *)malloc(sizeof(char)*MAX_LEN);
scanf("%s",dish);
memcpy(tmp_dish,dish,sizeof(char)*MAX_LEN);
int len=strlen(dish);
for(i=1; i<len; i++)
{
int rev,swp;
for(rev=0; rev<4; rev++)
{
switch(rev)
{
case 0:
break;
case 1:
reverse(0,i,tmp_dish);
break;
case 2:
reverse(i,len,tmp_dish);
break;
case 3:
reverse(0,i,tmp_dish);
reverse(i,len,tmp_dish);
break;
}
for(swp=0; swp<2; swp++)
{
switch(swp)
{
case 0:
break;
case 1:
swap(i,len,tmp_dish);
break;
}
if(chk_isnew(tmp_dish,&head)) result[cnt]++;
}
memcpy(tmp_dish,dish,sizeof(char)*MAX_LEN);
}
}
link t=head;
while(t->next!=NULL)
{
t=t->next;
}
link r;
t=head;
while(t->next!=NULL)
{
r=t;
t=t->next;
free(r->p);
free(r);
}
free(dish);
free(tmp_dish);
}
for(cnt=0; cnt<num; cnt++)
{
printf("%d\n",result[cnt]);
}
return 0;
}