Nickolay.info. Алгоритмы. Расстановка слонов и ладей на шахматной доске

Разместить на шахматной доске максимальное количество слонов и ладей так, чтобы они не находились друг у друга " под боем".

Будем вводить количество слонов и определять для него количество ладей. Результат выдадим как консольную картинку.

#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 Кб)

Рейтинг@Mail.ru

вверх гостевая; E-mail