 "SADDLE POINTS"? • Question

• okay, i hv finished all my exercises except this one..this one makes me sooo urggh.. im so confused!!

Write a program that search for the "saddle point" in a 5 by 5 array of integers. A saddle point in a cell whose value is greater than or equal to any in its row, and less than or equal to any in its column. There may be more than one saddle point in the array. Print  out the coordinates of any saddle points your program finds. Print out "No Saddle Points" if  there are none. Use the following values as your initial values of array

34           21           32           41           25

14           42           43           14           31

64           45           62           42           23

23           15           51           31           25

21           52           22           13           23

• Edited by Tuesday, September 6, 2011 12:31 PM
Tuesday, September 6, 2011 12:28 PM

• Here is a working code:

static void Main(string[] args)
{
int[,] myArray ={
{34 , 21 , 32, 41, 25},
{14 , 42, 43, 14, 31},
{64, 45, 62, 42, 23},
{23, 15, 51 , 31 , 25},
{21, 25 , 30 , 13 , 23}
};

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (IsGreaterThanAnyNumberInRow(myArray, i, j))
continue;
else
if (IsLessThanAnyNumberInColumn(myArray, i, j))
continue;

Console.WriteLine("{0} in Row {1} Col {2} Is a saddle", myArray[i, j], i + 1, j + 1);
}
}

Console.WriteLine("There was no saddle point in the array");

}

private static bool IsLessThanAnyNumberInColumn(int[,] myArray, int i, int j)
{
return myArray[i, j] > myArray[0, j] || myArray[i, j] > myArray[1, j] || myArray[i, j] > myArray[2, j] || myArray[i, j] > myArray[3, j] || myArray[i, j] > myArray[4, j];
}

private static bool IsGreaterThanAnyNumberInRow(int[,] myArray, int i, int j)
{
return myArray[i, j] < myArray[i, 0] || myArray[i, j] < myArray[i, 1] || myArray[i, j] < myArray[i, 2] || myArray[i, j] < myArray[i, 3] || myArray[i, j] < myArray[i, 4];
}

BTW - In the array that you have provided there is no saddle point.

I changed the values in order to have one.

So check both arrays.

Noam B.

• Edited by Tuesday, September 6, 2011 1:58 PM
• Marked as answer by Tuesday, September 6, 2011 2:01 PM
Tuesday, September 6, 2011 1:49 PM

All replies

• Hi,

ok, you can store teh values in a 2 dimensional array. So a point is a saddle point, when all these checks are true:

bool IsSaddlePoint(int[,] Points, int x, int y)
{
return (Compare(Points, x,  y, x, y-1) &&
Compare(Points, x, y, x, y+1) &&
Compare(Points, x, y, x-1, y) &&
Compare(Points, x, y, x+1, y));
}

bool Compare (int[,] Points, int x1, int y1, int x2, int y2)
{
if ( (x1<0) || (y1<0) || (x2<0) || (y2<0) || (x1>=5) || (x2>=5) || (y1>=5) || (y2>=5) )
return true;
return Points[x1,y1] > Points[x2,y2];
}

So I compare the point with the points above, bolow and to the sides. The compare is simply a compare of the given values. If a point does not exist, the result is also true.

(So you can compare Field [0,0] to [0,-1] - there is no point [0,-1] so we have to ignore it. And we put together the results be an logical and operation and a neutral element in there is true:
true && something = something.)

Hope that helped. code was never checked - just written out ofmy head.

Tuesday, September 6, 2011 12:46 PM
• thank you ill try it

Tuesday, September 6, 2011 1:03 PM
• Here is a working code:

static void Main(string[] args)
{
int[,] myArray ={
{34 , 21 , 32, 41, 25},
{14 , 42, 43, 14, 31},
{64, 45, 62, 42, 23},
{23, 15, 51 , 31 , 25},
{21, 25 , 30 , 13 , 23}
};

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (IsGreaterThanAnyNumberInRow(myArray, i, j))
continue;
else
if (IsLessThanAnyNumberInColumn(myArray, i, j))
continue;

Console.WriteLine("{0} in Row {1} Col {2} Is a saddle", myArray[i, j], i + 1, j + 1);
}
}

Console.WriteLine("There was no saddle point in the array");

}

private static bool IsLessThanAnyNumberInColumn(int[,] myArray, int i, int j)
{
return myArray[i, j] > myArray[0, j] || myArray[i, j] > myArray[1, j] || myArray[i, j] > myArray[2, j] || myArray[i, j] > myArray[3, j] || myArray[i, j] > myArray[4, j];
}

private static bool IsGreaterThanAnyNumberInRow(int[,] myArray, int i, int j)
{
return myArray[i, j] < myArray[i, 0] || myArray[i, j] < myArray[i, 1] || myArray[i, j] < myArray[i, 2] || myArray[i, j] < myArray[i, 3] || myArray[i, j] < myArray[i, 4];
}

BTW - In the array that you have provided there is no saddle point.

I changed the values in order to have one.

So check both arrays.

Noam B.

• 