Witam,
próbuję rozwiązać zadanie z wyzwań programistycznych i chciałbym was prosić o pomoc w znalezieniu błędu w moim kodzie, a najbardziej mi by zależało na znalezieniu takich danych wejściowych, żeby mój program się pomylił. Link do treści zadania http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110107&format=html
mój kod:
#include <iostream>
using namespace std;
char board[8][8];
enum winner {NO, WHITE, BLACK};
//czy `board` jest pusta?
bool empty()
{
for (int i=0; i<8; i++)
for (int j=0; j<8; j++)
if (board[i][j] != '.')
return false;
return true;
}
//wczytuje planszę ze standardowego wejścia
void read()
{
for (int i=0; i<8; i++)
for (int j=0; j<8; j++)
cin>>board[i][j];
}
//wyświetla planszę
void write()
{
for (int i=0; i<8; i++)
{
for (int j=0; j<8; j++)
cout<<board[i][j];
cout<<endl;
}
}
//czy wieża stojąca na 'i' oraz 'j' atakuje króla 'k'?
bool rook(int i, int j, char k)
{
int x;
//idę pionowo w dół
for (x = i + 1; x<8; x++)
{
if (board[x][j] != '.')
{
if (board[x][j] == k)
return true;
else
return false;
}
}
//idę pionowo w górę
for (x = i - 1; x>=0; x--)
if (board[x][j] != '.')
{
if (board[x][j] == k)
return true;
else
return false;
}
//poziomo w prawo
for (x = j + 1; x<8; x++)
{
if (board[i][x] != '.')
{
if (board[i][x] == k)
return true;
else
return false;
}
}
//poziomo w lewo
for (x = j - 1; x >= 0; x--)
if (board[i][x] != '.')
{
if (board[i][x] == k)
return true;
else
return false;
}
return false;
}
//goniec xD
bool bishop(int i, int j, char k)
{
//w dół i prawo
int x=1;
while ((i+x != 8) && (j+x != 8))
{
if (board[i+x][j+x] != '.')
{
if (board[i+x][j+x] == k)
return true;
else
return false;
}
x++;
}
//do góry i w lewo
x = 1;
while ((i-x >= 0) && (j-x >= 0))
{
if (board[i-x][j-x] != '.')
{
if (board[i-x][j-x] == k)
return true;
else
return false;
}
x++;
}
//do góry i w prawo
x = 1;
while ((i+x != 8) && (j-x >= 0))
{
if (board[i+x][j-x] != '.')
{
if (board[i+x][j-x] == k)
return true;
else
return false;
}
x++;
}
//w dół i w lewo
x = 1;
while ((i-x >= 0) && (j+x != 8))
{
if (board[i-x][j+x] != '.')
{
if (board[i-x][j+x] == k)
return true;
else
return false;
}
x++;
}
return false;
}
//królowa xD
bool queen (int i, int j, char k)
{
//połączenie wieży i gońca
return bishop(i, j, k) || rook(i, j, k) ? true: false;
}
/*skoczek
*........
*........
*..3.5...
*.1...7..
*...n....
*.2...8..
*..4.6...
*........
*
*/
bool knight (int x, int y, char k)
{
//1
if ((x-1 >= 0) && (y-2 >= 0))
{
if (board[x-1][y-2] == k)
return true;
}
//2
if ((x+1 < 8) && (y-2 >= 0))
{
if (board[x+1][y-2] == k)
return true;
}
//3
if ((x-2 >= 0) && (y-1 >= 0))
{
if (board[x-2][y-1] == k)
return true;
}
//4
if ((x + 2< 8) && (y-1 >= 0))
{
if (board[x+2][y-1] == k)
return true;
}
//5
if ((x-2 >= 0) && (y+1 < 8))
{
if (board[x-2][y+1] == k)
return true;
}
//6
if ((x+2 < 8) && (y+1 < 8))
{
if (board[x+2][y+1] == k)
return true;
}
//7
if ((x-1 >= 0) && (y+2 < 8))
{
if (board[x-1][y+2] == k)
return true;
}
//8
if ((x+1 < 8) && (y+2 < 8))
{
if (board[x+1][y+2] == k)
return true;
}
return false;
}
//pionek
bool pawn (int i, int j, char k)
{
if (k == 'K') //atakujemy w dół (białego króla)
{
if (i+1 < 8)
{
if (j-1 >= 0) //atak w dół i lewo
if (board[i+1][j-1] == k)
return true;
if (j+1 < 8) //atak w dół i prawo
if (board[i+1][j+1] == k)
return true;
}
}
else//if (k == 'K') //atak czarnego króla
{
if (i-1 >= 0)
{
if (j-1 >= 0) //atak do góry i w lewo
if (board[i-1][j-1] == k)
return true;
if (i+1 < 8) //atak do góry i w prawo
if (board[i-1][j+1] == k)
return true;
}
}
return false;
}
//król (nie może być, bo by się równocześnie atakowały i byłyby 2 szachy na raz)
/*bool king(int x, int y, char k)
{
return false;
}*/
int main()
{
board[0][0] = 'D';
winner w ;
int game = 0;
while (!empty())
{
read(); //wczytuję planszę
game ++; //inkrementuję liczbę gier
w = NO; //oznaczam, że jak na razie jest remis
for (int i = 0; i<8; i++)
for (int j=0; j<8; j++)
{
switch (board[i][j])
{
case 'p': //pionek
if (pawn (i, j, 'K'))
{
w = BLACK;
break;
}
break;
case 'P':
if (pawn (i, j, 'k'))
{
w = WHITE;
break;
}
break;
case 'r':
if(rook (i, j, 'K'))
{
w = BLACK;
break;
}
break;
case 'R':
if (rook (i, j, 'k'))
{
w = WHITE;
break;
}
break;
case 'b':
if (bishop (i, j, 'K'))
{
w = BLACK;
break;
}
break;
case 'B':
if (bishop (i, j, 'k'))
{
w = WHITE;
break;
}
break;
case 'q':
if (queen (i, j, 'K'))
{
w = BLACK;
break;
}
break;
case 'Q':
if (queen (i, j, 'k'))
{
w = WHITE;
break;
}
break;
case 'n':
if (knight (i, j, 'K'))
{
w = BLACK;
break;
}
break;
case 'N':
if (knight (i, j, 'k'))
{
w = WHITE;
break;
}
break;
}
if (w != NO)
break;
}
switch (w)
{
case NO:
if (!empty())
{
cout <<"Game #"<<game<<": no king is in check."<<endl;
}
break;
case WHITE:
cout <<"Game #"<<game<<": black king is in check."<<endl;
break;
case BLACK:
cout <<"Game #"<<game<<": white king is in check."<<endl;
break;
}
}//while
}
rozwiązałem już z tej strony kilka zadań, ale tutaj nie mogę znaleźć swojego błędu ;/