52xiao千 发表于 2014-1-2 23:13:59

C语言写的马踏棋盘 动态显示求解过程

#include<stdio.h>
#include <time.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<string.h>
#define MAXSIZE 100       
#define N 8
int board;         
int Addi={1,-1,-2,2,2,1,-1,-2};
int Addj={2,-2,1,1,-1,-2,2,-1};
struct Stack      
{            
        int i;            
        int j;            
        int director;      
}stack;      
int top=-1;            
void menu()
{
        system("color 9a");
        printf("\t\t\t******************************\n");
        printf("\t\t\t*\t马 踏 棋 盘          *\n");
        printf("\t\t\t******************************\n");
        printf("\t\t\t* 1.初始化马的起始位置       *\n");
        printf("\t\t\t*                            *\n");
        printf("\t\t\t* 2.浏览寻址结果             *\n");
        printf("\t\t\t*                            *\n");
        printf("\t\t\t* 3.退出                     *\n");
        printf("\t\t\t******************************\n");
}
int FindPath(int i,int j)
{
        int find,director,number,min;
        int i1,j1,h,k,s;            
        int a,b1,b2,d;
        while(top>-1)         
        {
                for(h=0;h<8;h++)   
                {
                        number=0;
                        i=stack.i+Addi;
                        j=stack.j+Addj;
                        b1=i;
                        b2=j;
                        if(board==0&&i>=0&&i<8&&j>=0&&j<8)
                        {
                                for(k=0;k<8;k++)
                                {
                                        i1=b1+Addi;
                                        j1=b2+Addj;
                                        if(board==0&&i1>=0&&i1<8&&j1>=0&&j1<8)
                                                number++;
                                }
                                a=number;
                        }
                }
                for(h=0;h<8;h++)
                {
                        min=9;
                        for(k=0;k<8;k++)
                                if(min>a)
                                {
                                        min=a;
                                        d=k;
                         s=k;
                                }
                                a=9;
                }
                director=stack.director;
                if(top>=63)
                        return (1);
                find=0;   
                for(h=director+1;h<8;h++)
                {
                        i=stack.i+Addi];
                        j=stack.j+Addj];
                        if(board==0&&i>=0&&i<8&&j>=0&&j<8)
                        {
                                find=1;      
                                break;
                        }
                }
                if(find==1)         
                {
                        stack.director=director;
                        top++;                     
                        stack.i=i;
                        stack.j=j;
                        stack.director=-1;   
                        board=top+1;
               
                }
                else                           
                {
                        board.i].j]=0;
                        top--;                     
                }
               
        }
                return (0);
}


void Save(int x,int y)
{
        int i,j,flag;
        FILE *fp;
        printf("是否保存结果(1/0):");
        scanf("%d",&flag);
        if(flag==1)
        {
        fp=fopen("123.txt","w");
        fprintf(fp,"马儿起始坐标为:(%d,%d)\n",x+1,y+1);
        for(i=0;i<N;i++,fprintf(fp,"\n\n",""))
        {
                for(j=0;j<N;j++)
                          fprintf(fp," %3d ",board);
       
        }
    fprintf(fp,"\n\n","");
        fclose(fp);
        printf("\n.........保存结果成功...........\n");
        }
        else if(flag==0);

       else system("pause");

}
void Read()
{
        FILE *fp;
        char ch;
        fp=fopen("123.txt","r");
        rewind(fp);
        printf("\n\n");
       ch=fgetc(fp);
    while(ch!=EOF)
        {
    putchar(ch);
        ch=fgetc(fp);
        }

fclose(fp);
}

void Display(int x,int y)
{
    int i,j,num=1;
        printf("\n");
        while(num<65)
        {
        printf("\n\n\t马踏棋盘寻址过程演示如下:\n\n");
        for(i=0;i<N;i++)
        {
                for(j=0;j<N;j++)
                if(board==num)
                        printf("\t%d",board);
                else printf("\t0 ");
                printf("\n\n");
        }
        Sleep(500);system("CLS");
        num++;
        }
        system("CLS");
        printf("\n\n\t马踏棋盘寻址最终结果如下:\n\n");
        for(i=0;i<N;i++)
        {
                for(j=0;j<N;j++)
       
                        printf("\t%d",board);
               
                printf("\n\n");
        }
    printf("\n.............是否保存结果.............");
        Save(x,y);

}

void Start(int xi,int yi)
{
        int x,y;
       
        top=-1;
        top++;                  
        stack.i=xi;      
        stack.j=yi;      
        stack.director=-1;
        board=top+1;   
        x=stack.i;         
        y=stack.j;         
        if(FindPath(x,y))      
                Display(x,y);         
        else
                printf("无解");
}
int Customer()
{
        char Iput2,Customer="1234567",ch;
        system("color 04");
        printf("\t\t\t*********************************\n");
        printf("\t\t\t*\t马 踏 棋 盘             *\n");
        printf("\t\t\t*********************************\n");
        printf("\t\t\t* 马踏棋盘规则:马在棋盘的任意位 *\n");
        printf("\t\t\t* 都遵守横两格上下竖一格,或者竖 *\n");
        printf("\t\t\t* 两个格子左右横移一个格子      *\n");
        printf("\t\t\t* (国际规则)                  *\n");
        printf("\t\t\t*********************************\n");
       int i=0;
   printf("\n\t\t\t请输入用户账户:");
       while(1)
       {
                ch=getch();
                if((ch>=65&&ch<=90||ch>=97&&ch<=122||ch>=48&&ch<=57)&&i<10)
                   Iput2=ch;
                else if(ch==8)
                {
                        printf("\b \b");
                        i--;
                        continue;
                }
                elsebreak;
                printf("*");
       }
   Iput2='\0';
       if(strcmp(Customer,Iput2)==0)return 1;
       else return 0;
}
int PassWord()
{
        int i=0;
        charPcode="1234567";
        charIput1,a;
        system("color 04");
    printf("\n\t\t\t请输入用户密码:");
        while(1)
       {
                a=getch();
                if((a>=65&&a<=90||a>=97&&a<=122||a>=48&&a<=57)&&i<10)
                   Iput1=a;
                else if(a==8)
                {
                        printf("\b \b");
                        i--;
                        continue;
                }
                elsebreak;
                printf("*");
       }
   Iput1='\0';
       if(strcmp(Pcode,Iput1)==0)return 1;
   elsereturn 0;

}
int EnterPass()
{
        int i=1;
        while(1)
        {
                if(i>3){system("CLS");printf("\n\t\1\1\1\1\1\1\1......输入密码已超过三次,谢谢使用!......\1\1\1\1\1\1\1\n\n");return 0;}
    if(Customer()&&PassWord())
        {
                printf("\n\n.........................登入成功,欢迎使用....................................\n");Sleep(2000);return 1;break;}
        else
        {
        system("CLS");printf("\n\t\t\t账户或密码错误...................\n");
        printf("\n\n");
        i++;
        }
        }
       
}

int main()
{   
        int x,y;
        int i,j,num,ts=10;
        if(EnterPass())
        {
loop: system("CLS");menu();
          printf("\n请用户输入菜单前的功能编号:");
          scanf("%d",&num);
          for(i=0;i<N;i++)            
                  for(j=0;j<N;j++)
                          board=0;
                  if(num==1)
                  {
                          while(1)
                          {
                                  printf("\n请输入起始位置的横坐标 x = ");
                                  scanf("%d",&x);         
                                  printf("\n请输入起始位置的纵坐标 y = ");
                                  scanf("%d",&y);      
                                  if(x>=1&&x<=8&&y>=1&&y<=8)break;
                                  printf("\n输入错误!_请用户按要求输入..............\n");
                          }
                          Start(x-1,y-1);
                  system("pause");
                  }
                  
                  else if(num==2){Read();system("pause");}
                  else return 0;
                  goto loop;
                  }
        else return 0;
}

页: [1]
查看完整版本: C语言写的马踏棋盘 动态显示求解过程