בעיית שמונה המלכות היא חידת שחמט שבה יש למקם שמונה...
בעיית שמונה המלכות היא חידת שחמט שבה יש למקם שמונה מלכות על לוח שחמט כך שאף אחת מהן לא מאיימת על אף אחת מחברותיה.
כתוב פעולה המקבלת מערך דו ממדי של טקסט מחרוזות, המייצג לוח של 8 מלכות.
מיקום של מלכה יסומן ב "QUEEN" ואילו מיקום ריק יסומן ב "".
הפעולה תחזיר אמת אם אף מלכה לא מאיימת על אף מלכה אחרת, אחרת שקר.
על חתימת הפונקציה להיראות כך:
public static bool IsEightQueensOk(string[,] chess)
פתרון בשפת C#:
האסטרטגיה שלנו היא למצוא מקום שבו יש מלכה ואז לבחון את כל הצדדים שלה: ימינה, שמאלה, למטה, למעלה, וכל האלכסונים.
// האם קיימת מלכה מצד ימין שלי
public static bool Right(string[,] chess, i,j)
{
j++;
while(j<8)
{
if( chess[i,j] == "QUEEN")
return true;
j++;
}
return false;
}
// האם קיימת מלכה מצד שמאל שלי
public static bool Left(string[,] chess, i,j)
{
j--;
while(j>=0)
{
if( chess[i,j] == "QUEEN")
return true;
j--;
}
return false;
}
// האם קיימת מלכה מעליי
public static bool Up(string[,] chess, i,j)
{
i--;
while(i>=0)
{
if( chess[i,j] == "QUEEN")
return true;
i--;
}
return false;
}
// האם קיימת מלכה מעליי
public static bool Down(string[,] chess, i,j)
{
i++;
while(i<8)
{
if( chess[i,j] == "QUEEN")
return true;
i++;
}
return false;
}
// האם קיימת מלכה בצד האלכסון הימני עליון
public static bool DiagonUpRight(string[,] chess, i,j)
{
i--; j++;
while(i>=0 && j<8)
{
if( chess[i,j] == "QUEEN")
return true;
i--; j++;
}
return false;
}
// האם קיימת מלכה בצד האלכסון השמאלי עליון
public static bool diagonUpLeft(string[,] chess, i,j)
{
i--; j--;
while(i>=0 && j>=0)
{
if( chess[i,j] == "QUEEN")
return true;
i--; j--;
}
return false;
}
// האם קיימת מלכה בצד האלכסון ימני תחתון
public static bool DiagonDownRight(string[,] chess, i,j)
{
i++; j++;
while(i<8 && j<8)
{
if( chess[i,j] == "QUEEN")
return true;
i++; j++;
}
return false;
}
// האם קיימת מלכה בצד האלכסון שמאלי תחתון
public static bool diagonDownLeft(string[,] chess, i,j)
{
i++; j--;
while(i<8 && j>=0)
{
if( chess[i,j] == "QUEEN")
return true;
i++; j--;
}
return false;
}
לאחר כל פעולות העזר, נבנה את הפעולה הראשית:
public static bool IsEightQueensOk(string[,] chess){
for(int i=0; i<8; i++)
for(int j=0; j<8; j++)
{
if( chess[i,j] =="Queen")
if( Right(chess, i, j) || Left(chess, i, j) || Up(chess, i, j) || Down(chess, i, j) || DiagonUpRight(chess,i,j) || DiagonUpLeft(chess,i,j) || DiagonDownRight(chess, i, j) || DiagonDownLeft(chess, i , j) )
return false; // נמצאה מלכה מאיימת
}
return true; // אין איום אחד על השני
}