poj1753(自己写的)明天等待试验

#include <stdio.h>
#include <math.h>

char data[17],result[17];
void inputdata(char *data);
int changeData(char *data);
void charChange(char *data,int i);
int panduan(char *data,int number);
void reverse(char *data,char *result,int i);
void chuli(const int number,int start,char *data,const int NUM,int *f);
int main(void)
{
    int min=0;
    inputdata(data);
    if((min=changeData(data))!=17)
        printf("%d\n",min);
    else 
        puts("Impossible\n");
        return 0;
}

void inputdata(char *data)
{
    int i;
    for(i=0;i<16;i++)
        while((data[i]=getchar())==' '||data[i]=='\n'||data[i]=='\t');
}
int changeData(char *data)
{
    int number;
    if(panduan(data,0)==0)
    {
        return 0;
    }
    for(number=1;number<17;number++){
            int start=0,NUM=number,last=17;
            chuli(number,start,data,NUM,&last);
            if(last==NUM)
                return NUM;
        }
    return 17;
}
void chuli(int number,int start,char *data,const int NUM,int *f)
{    
    int i,min;
    static int ok=0;
    for(i=start;i<=16-number;i++)
    {
    //    printf("i=%d\n",i);
    //    printf("i=%d start=%d number=%d\n",i,start,number);
        result[number-1]=i;
        printf("i=%d result[%d]=%d\n",i,number-1,result[number-1]);
        if(number-1==0)
        {
            //printf("if(number-1==0)\ni=%d",i);
            int j;
            for(j=NUM;j>0;j--)
                reverse(data,result,j-1);
            *f=panduan(data,number);
            printf("*f=%d",*f);
            if(*f!=17)//取它时候必须取它的指向的对象 
            {
                printf("1111111111111111\n");
                ok=1;
            }else{
                for(j=NUM;j>0;j--)
                    reverse(data,result,j-1);
            }
            if(ok==1)
            {//在下面用if语句+break即可 
                break;
                printf("break;\n");
            }
        }else{
            chuli(number-1,start+1,data,NUM,f);
            printf("xunhuan\n");
        }
        
    }
}
int panduan(char *data,int number)
{
    char *p=data;
    int i=0;
    while((*(p+i)==*data)&&(i<=15))
    {
        i++;    
    }
    if(i==16)
        return number;
    return 17;
}
void reverse(char *data,char *result,int i)
{
    i=result[i];//注意i要转化 
    printf("i=%d",i);
    charChange(data,i);//自身也要发生变化 
    int line,row;
    line=i/4;
    row=i%4;
    if(line+1<4)
        charChange(data,i+4); 
    if(line-1>=0)
        charChange(data,i-4);
    if(row+1<4)
        charChange(data,i+1);
    if(row-1>=0)
        charChange(data,i-1);
        
}
void charChange(char *data,int i)
{
    if(data[i]=='b')
        data[i]='w';
    else
        data[i]='b';
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值