#include void initialize();                                         //初始化
void near1(int a,int b,int a1,int b1);          //算法
void print_chess();                                   //打印棋盘
int exit_chess();                                        //判断是否结束
//全局变量
char chessman[10][10];                         //编译系统初始化每个元素为0
void main()
{
int row,line;                             //row是行号,line是列号
int row2,line2;                         //row是行号,line是列号
printf("\t\t\t按任意键开始\n");
fflush(stdin);
getch();
initialize();                //初始化棋盘内容
do
{
print_chess();
printf("输入第一个:");
fflush(stdin);
scanf("%d.%d",&line,&row);
printf("输入第二个:");
fflush(stdin);
scanf("%d.%d",&line2,&row2);
if(chessman[line][row]!=chessman[line2][row2])
{
printf("两数不相同!\n");                        //两数不同
}
else if(line==line2&&row==row2)
{
printf("错误输入!!!\n");                  //输入相同的坐标,提示用户错误
}
else if(line<=line2)
{
near1(line,row,line2,row2);                //使用函数处理,第一个点一定在第二个点上方
}
else
{
near1(line2,row2,line,row);                //使用函数处理
}
system("pause");
}while(exit_chess());
system("pause");
printf("\n\n\n\t\t恭喜您,您胜利了!\n");
printf("\n\t\t制作人:蒋睿立\n");
printf("\n\t博客:http:\\maidini.blog.163.com");
}
void initialize()                     //初始化棋盘
{
int i,j;                          //用于循环计数
int a[8]={0};                //记录哪些字符出现次数不是偶数
srand(time(NULL));
for(i=1;i<8;i++)                //这里只随机前8行,留最后一行不打印
for(j=1;j<9;j++)
{
chessman[i][j]=rand()%8+65;         //棋盘内容为大写字母A到H
if(chessman[i][j]==65) a[0]++;        //记录A的个数
if(chessman[i][j]==66) a[1]++;        //记录B的个数
if(chessman[i][j]==67) a[2]++;        //记录C的个数
if(chessman[i][j]==68) a[3]++;        //记录D的个数
if(chessman[i][j]==69) a[4]++;        //记录E的个数
if(chessman[i][j]==70) a[5]++;        //记录F的个数
if(chessman[i][j]==71) a[6]++;        //记录G的个数
if(chessman[i][j]==72) a[7]++;        //记录H的个数
}
for(i=0;i<8;i++)
{
if(a[i]%2!=0)        //如果字符的个数是奇数就还需要打印一个
chessman[8][i+1]=i+65;
else                    //如果前面7行随机的A到H字符恰好是偶数,最后一行全是I字符
chessman[8][i+1]=73;
}
}
void print_chess()                //打印棋盘内容
{
int i,j;
system("cls");
printf("\t       1   2   3   4   5   6   7   8   \n");
for(i=0;i<10;i++)
{
printf("\t\n\t");
for(j=0;j<10;j++)
{
printf("%4c",chessman[i][j]);
if(j==9&&i!=0&&i!=9)
printf("\t%d",i);
}
}
printf("\n\n\n\n");
}
int exit_chess()                //判断是否满足退出
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
if(chessman[i][j]!=0)
return 1;        //只要有1个棋子不为0,就返回1
}
return 0;
}
void near1(int a,int b,int a1,int b1)
{
int arow[2];
int aline[2];
int brow[2];
int bline[2];
int start=0,end=0;                //临时两个点
int i,j,n;                                //用于循环
for(i=0;i<2;i++)        //初始化数组
{
arow[i]=a;
brow[i]=a1;
aline[i]=b;
bline[i]=b1;
}
(a,b) a行中有哪些列
for(i=a+1;i<10;i++)
{
if(chessman[i][b]==0)
arow[1]=i;                                //arow[1]是A点a行向下向量
else
break;
}
for(i=a-1;i>=0;i--)
{
if(chessman[i][b]==0)                //arow[0]是A点a行向上向量
arow[0]=i;
else
break;
}
(a1,b1) a1行中有哪些列
for(i=a1+1;i<10;i++)
{
if(chessman[i][b1]==0)                //brow[1]是B点a1行向下向量
brow[1]=i;
else
break;
}
for(i=a1-1;i>=0;i--)
{
if(chessman[i][b1]==0)                //brow[0]是B点a1行向上向量
{brow[0]=i;}
else
{break;}
}
//(a,b) b列中有哪些行
for(i=b+1;i<10;i++)
{
if(chessman[a][i]==0)                //aline[1]是A点b列向右向量
{aline[1]=i;}
else
{break;}
}
for(i=b-1;i>=0;i--)
{
if(chessman[a][i]==0)                //aline[0]是A点b列向左向量
{aline[0]=i;}
else
{break;}
}
//(a1,b1) b1列中有哪些行
for(i=b1+1;i<10;i++)
{
if(chessman[a1][i]==0)                //bline[1]是B点b1列向右向量
{bline[1]=i;}
else
{break;}
}
for(i=b1-1;i>=0;i--)
{
if(chessman[a1][i]==0)                //bline[0]是B点b1列向左向量
{bline[0]=i;}
else
{break;}
}
//关键算法///
/********************************
情况一
·
(a,b)
·(a1,b1)
*********************************/
/*********************************
情况二
·
(a,b)
·(a1,b1)
**********************************/
/*考虑上下向量*/
if(brow[0]>=arow[0])                //向上方向向量 有共同的列向量
start=brow[0];                        //取大的
else
start=arow[0];
if(brow[1]<=arow[1])                //向下方向向量 有共同的列向量
end=brow[1];                        //取小的
else
end=arow[1];
for(;start<=end;start++)                //列向量上共同点start到end
{
/** b1要大于b,否则就交换
如果不交换将使下面的循环出错*/
if(b0))                //因为b与b1大小不能确定,所有有2个if
chessman[a][b]=chessman[a1][b1]=0;
if((n==b1-b)&&(n>0))
chessman[a][b]=chessman[a1][b1]=0;
}
/*考虑左右向量*/
if(aline[0]>=bline[0])                //向左的向量 有共同的行向量
start=aline[0];                        //取大的
else
start=bline[0];
if(aline[1]0)        //a1始终大于a
{
chessman[a][b]=chessman[a1][b1]=0;
break;
}
}
/*********************************************************************************
*                        同行               或者           同列          ·(a,b)
*
*         ·                  ·           或者
*        (a,b)          (a1,b1)                                           ·(a1,b1)
*
*********************************************************************************/
if(a==a1)                //同行
{
if((aline[1]>=b1)||(aline[0]<=b1))
chessman[a][b]=chessman[a1][b1]=0;
}
if(b==b1)               //同列
{
if(arow[1]>=a1)
chessman[a][b]=chessman[a1][b1]=0;
}
}