Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private static int CalculatePeacefulArrangement(int queenCount, int[] chessTable, int startPosition, int result)
- {
- if (startPosition == chessTable.Length)
- {
- result++;
- return result;
- }
- for (int i = 0; i < queenCount; i++)
- {
- var index = Array.IndexOf(chessTable, 0, startPosition + i, queenCount - i);
- if (index != -1)
- {
- var row = index - startPosition;
- NoteBeatenCellAscendingDiagonal(queenCount, chessTable, index, 1);
- NoteBeatenCellDiscendingDiagonal(queenCount, chessTable, index, 1);
- NoteBeatenCellHorizontal(queenCount, chessTable, index, row, 1);
- result = CalculatePeacefulArrangement(queenCount, chessTable, startPosition + queenCount, result);
- NoteBeatenCellAscendingDiagonal(queenCount, chessTable, index, -1);
- NoteBeatenCellDiscendingDiagonal(queenCount, chessTable, index, -1);
- NoteBeatenCellHorizontal(queenCount, chessTable, index, row, -1);
- i = row;
- }
- else break;
- }
- return result;
- }
- private static void NoteBeatenCellHorizontal(int queenCount, int[] chessTable, int index, int row, int marking)
- {
- var column = index / queenCount;
- for (int i = column; i < queenCount; i++)
- {
- chessTable[i * queenCount + row] += marking;
- }
- }
- private static void NoteBeatenCellAscendingDiagonal(int queenCount, int[] chessTable, int index, int marking)
- {
- for (int i = index; i < chessTable.Length; i += queenCount + 1)
- {
- chessTable[i] += marking;
- if (i / queenCount == queenCount - 1 || i % queenCount == queenCount - 1) break;
- }
- }
- private static void NoteBeatenCellDiscendingDiagonal(int queenCount, int[] chessTable, int index, int marking)
- {
- for (int i = index; i < chessTable.Length; i += queenCount - 1)
- {
- chessTable[i] += marking;
- if (i / queenCount == queenCount - 1 || i % queenCount == 0) break;
- }
- }
- void PrintA()
- {
- for (int i = 0; i < 100; i++) Console.WriteLine($"A {i}");
- }
- void PrintB()
- {
- for (int i = 0; i < 100; i++) Console.WriteLine($"B {i}");
- }
- var taskA = Task.Run(()=>PrintA());
- var taskB = Task.Run(()=>PrintB());
- Task.WaitAll(taskA, taskB);
Add Comment
Please, Sign In to add comment