Pers.narod.ru. Алгоритмы. Расстановка слонов и ладей на шахматной доске |
Разместить на шахматной доске максимальное количество слонов и ладей так, чтобы они не находились друг у друга " под боем".
Будем вводить количество слонов и определять для него количество ладей. Результат выдадим как консольную картинку.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
char b[8][8];
void Print (void) {
int i,j;
clrscr();
for (i=0; i<8; i++) {
for (j=0; j<8; j++) {
if ((b[i][j]=='С') || (b[i][j]=='Л')) textcolor (RED);
else textcolor (LIGHTGRAY);
cprintf ("%1c",b[i][j]);
}
printf ("\n");
}
delay (100);
}
int Slon (int x,int y) {
int i;
for (i=0; i<8; i++) if (b[i][y]=='С') return 1;
for (i=0; i<8; i++) if (b[x][i]=='С') return 1;
return 0;
}
int Lad (int x0,int y0) {
int x,y;
x=x0; y=y0;
do {
if (b[x][y]=='Л') return 1;
x--; y++;
} while ((x>=0) && (y<8));
x=x0; y=y0;
do {
if (b[x][y]=='Л') return 1;
x--; y--;
} while ((x>=0) && (y>=0));
x=x0; y=y0;
do {
if (b[x][y]=='Л') return 1;
x++; y--;
} while ((x<8) && (y>=0));
x=x0; y=y0;
do {
if (b[x][y]=='Л') return 1;
x++; y++;
} while ((x<8) && (y<8));
return 0;
}
void AddLad (int x,int y) {
int i;
b[x][y]='Л';
for (i=0; i<8; i++) if (i!=x) b[i][y]='X';
for (i=0; i<8; i++) if (i!=y) b[x][i]='X';
}
void AddSlon (int x0,int y0) {
int x,y;
b[x0][y0]='С';
x=x0-1; y=y0+1;
while ((x>=0) && (y<8)) {
b[x][y]='X'; x--; y++;
};
x=x0-1; y=y0-1;
while ((x>=0) && (y>=0)) {
b[x][y]='X'; x--; y--;
};
x=x0+1; y=y0-1;
while ((x<8) && (y>=0)) {
b[x][y]='X'; x++; y--;
};
x=x0+1; y=y0+1;
while ((x<8) && (y<8)) {
b[x][y]='X'; x++; y++;
};
}
void main (void) {
int x,y,i,j,lr,sr,l,s;
textmode(C40);
printf ("\n Расстановка ладей и слонов");
do {
printf ("\n Введите количество ладей [1-7]");
fflush (stdin);
scanf ("%d",&l);
} while (!((l>0) && (l<8)));
for (i=0; i<8; i++) for (j=0; j<8; j++) b[i][j]='¦';
Print();
s=8-l;
lr=sr=0;
do {
if (lr<l) {
for (x=0; x<8; x++) for (y=0; y<8; y++)
if ((b[x][y]=='¦') && (!Slon(x,y))) {
AddLad (x,y);
lr++;
Print();
goto m10;
}
}
m10:
if (sr<s) {
for (x=0; x<8; x++) for (y=0; y<8; y++)
if ((b[x][y]=='¦') && (!Lad(x,y))) {
AddSlon (x,y);
sr++;
Print();
goto m20;
}
}
m20:
} while (lr+sr<8);
i=0; j=0;
do {
if (b[i][j]=='¦') {
if (!Slon(i,j)) { AddLad (i,j); lr++; Print(); }
else if (!Lad (i,j)) { AddSlon (i,j); sr++; Print(); }
}
j++;
if (j==8) {
j=0; i++;
if (i==8) break;
}
} while (1);
gotoxy (1,10);
printf ("\n Л - ладья, С - слон");
fflush (stdin);
getch();
textmode(C80);
}
Архив ZIP с файлами (14 Кб)
|
|