Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
Untitled diff
创建于
9年前
差异永不过期
清除
导出
分享
解释
77 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
359 行
全部复制
77 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
354 行
全部复制
using System;
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
using System.Text;
using System.Text;
using System.Threading.Tasks;
using System.Threading.Tasks;
namespace QueenAttack2
namespace QueenAttack2
{
{
class QueenAttack2
class QueenAttack2
{
{
internal class Directions
internal class Directions
{
{
public static int[] directions_row = new int[] { -1, -1, 0, 1, 1, 1, 0, -1 };
public static int[] directions_row = new int[] { -1, -1, 0, 1, 1, 1, 0, -1 };
public static int[] directions_col = new int[] { 0, -1, -1, -1, 0, 1, 1, 1 };
public static int[] directions_col = new int[] { 0, -1, -1, -1, 0, 1, 1, 1 };
public int rows;
public int rows;
public int[] minimumDistance;
public int[] minimumDistance;
public bool[] minimumDistanceExist;
public bool[] minimumDistanceExist;
public Tuple<int, int> queen {set; get;}
public Tuple<int, int> queen {set; get;}
public Directions(int row, int col, int size)
public Directions(int row, int col, int size)
{
{
queen = new Tuple<int, int>(row, col);
queen = new Tuple<int, int>(row, col);
minimumDistance = new int[8];
minimumDistance = new int[8];
minimumDistanceExist = new bool[8];
minimumDistanceExist = new bool[8];
rows = size;
rows = size;
}
}
/*
/*
* left, right, up, down, or the four diagonals
* left, right, up, down, or the four diagonals
* 8 directions - clockwise, starting from left.
* 8 directions - clockwise, starting from left.
*/
*/
public bool IsOneOfEightDirections(
public bool IsOneOfEightDirections(
int obstacle_row,
int obstacle_row,
int obstacle_col)
int obstacle_col)
{
{
return (obstacle_col == queen.Item2 ||
return (obstacle_col == queen.Item2 ||
obstacle_row == queen.Item1 ||
obstacle_row == queen.Item1 ||
Math.Abs(obstacle_row - queen.Item1) == Math.Abs(obstacle_col - queen.Item2)
Math.Abs(obstacle_row - queen.Item1) == Math.Abs(obstacle_col - queen.Item2)
);
);
}
}
/*
/*
* Go over 100000 obstacles, and find those 8 minimum one if there is.
* Go over 100000 obstacles, and find those 8 minimum one if there is.
*
*
*/
*/
public void Keep8MininumObstacles(Tuple<int,int>[] obstacles)
public void Keep8MininumObstacles(Tuple<int,int>[] obstacles)
{
{
for(int i = 0; i < obstacles.Length; i ++)
for(int i = 0; i < obstacles.Length; i ++)
{
{
Tuple<int, int> obstacle = obstacles[i];
Tuple<int, int> obstacle = obstacles[i];
if(!IsOneOfEightDirections(obstacle.Item1, obstacle.Item2))
if(!IsOneOfEightDirections(obstacle.Item1, obstacle.Item2))
{
{
continue;
continue;
}
}
UpdateOneOfDirection(obstacle);
UpdateOneOfDirection(obstacle);
}
}
}
}
/*
/*
*
*
*/
*/
private void UpdateOneOfDirection(Tuple<int, int> obstacle)
private void UpdateOneOfDirection(Tuple<int, int> obstacle)
{
{
复制
已复制
复制
已复制
bool
isSameRow
= obstacle.Item1 == queen.Item1
;
bool
isDirectionLeft
= obstacle.Item1 == queen.Item1
&&
obstacle.Item2 < queen.Item2;
bool isSameCol = obstacle.Item2 == queen.Item2;
bool
isDirectionRight
= obstacle.Item
1 ==
queen.Item
1 &&
obstacle.Item
2
> queen.Item
2;
bool isObstacleLeft =
obstacle.Item2 < queen.Item2;
bool
isObstacleRight
= obstacle.Item
2 >
queen.Item
2;
bool isObstacleUp =
obstacle.Item
1
> queen.Item
1;
bool isObstacleDown = obstacle.Item1 < queen.Item1;
bool isDirectionLeft = isSameRow && isObstacleLeft;
bool isDirectionRight = isSameRow && isObstacleRight;
复制
已复制
复制
已复制
bool isDirectionUp =
isSameCol
&&
isO
bstacle
Up
;
bool isDirectionUp =
obstacle.Item1 > queen.Item1
&&
o
bstacle
.Item2 == queen.Item2
;
bool isDirectionDown =
isSameCol
&&
isObstacleDown
;
bool isDirectionDown =
obstacle.Item1 < queen.Item1
&&
obstacle.Item2 == queen.Item2
;
复制
已复制
复制
已复制
bool isDirectionUpLeft
= isO
bstacle
Up
&&
isObstacleLeft;
bool isDirectionUpLeft
= o
bstacle
.Item1 > queen.Item1
&&
obstacle.Item2 < queen.Item2;
bool isDirectionUpRight
= isO
bstacle
Up && isObstacleRight;
bool isDirectionUpRight
= o
bstacle
.Item1 > queen.Item1 && obstacle.Item2 > queen.Item2;
bool isDirectionDownRight = obstacle.Item1 < queen.Item1 && obstacle.Item2 > queen.Item2;
bool isDirectionDownLeft = obstacle.Item1 < queen.Item1 && obstacle.Item2 < queen.Item2;
复制
已复制
复制
已复制
bool isDirectionDownLeft = isObstacleDown && isObstacleLeft;
bool isDirectionDownRight = isObstacleDown && isObstacleRight;
复制
已复制
复制
已复制
// verify left, up, right, down
// direction left:
// direction left:
if (isDirectionLeft)
if (isDirectionLeft)
{
{
int current = Math.Abs(queen.Item2 - obstacle.Item2);
int current = Math.Abs(queen.Item2 - obstacle.Item2);
UpdateMinimumDistanceInfo(0, current);
UpdateMinimumDistanceInfo(0, current);
}
}
复制
已复制
复制
已复制
Text moved from lines 117-122
if (isDirectionUpLeft)
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(1, current);
}
if (isDirectionUp)
if (isDirectionUp)
{
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(2, current);
UpdateMinimumDistanceInfo(2, current);
}
}
复制
已复制
复制
已复制
Text moved from lines 123-128
if (isDirectionUpRight)
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(3, current);
}
if (isDirectionRight)
if (isDirectionRight)
{
{
int current = Math.Abs(queen.Item2 - obstacle.Item2);
int current = Math.Abs(queen.Item2 - obstacle.Item2);
UpdateMinimumDistanceInfo(4, current);
UpdateMinimumDistanceInfo(4, current);
}
}
复制
已复制
复制
已复制
Text moved from lines 129-132
if (isDirectionDownRight)
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(5, current);
}
if (isDirectionDown)
if (isDirectionDown)
{
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(6, current);
UpdateMinimumDistanceInfo(6, current);
}
}
复制
已复制
复制
已复制
// verify 4 cross directions
Text moved to lines 89-94
if (isDirectionUpLeft)
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(1, current);
}
Text moved to lines 101-106
if (isDirectionUpRight)
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(3, current);
}
Text moved to lines 113-116
if (isDirectionDownRight)
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(5, current);
}
if (isDirectionDownLeft)
if (isDirectionDownLeft)
{
{
int current = Math.Abs(queen.Item1 - obstacle.Item1);
int current = Math.Abs(queen.Item1 - obstacle.Item1);
UpdateMinimumDistanceInfo(7, current);
UpdateMinimumDistanceInfo(7, current);
}
}
}
}
/*
/*
* 8 directions, use directions_row, directions_col as instruction
* 8 directions, use directions_row, directions_col as instruction
*/
*/
private void UpdateMinimumDistanceInfo(int direction, int current)
private void UpdateMinimumDistanceInfo(int direction, int current)
{
{
if (!minimumDistanceExist[direction])
if (!minimumDistanceExist[direction])
复制
已复制
复制
已复制
{
minimumDistanceExist[direction] = true;
minimumDistance[direction] = current;
}
else
{
if (current < minimumDistance[direction])
{
{
复制
已复制
复制
已复制
minimumDistanceExist[direction] = true;
minimumDistance[direction] = current;
minimumDistance[direction] = current;
}
}
复制
已复制
复制
已复制
}
else
{
if (current < minimumDistance[direction])
{
minimumDistance[0] = current;
}
}
}
}
public int CalculateTotal()
public int CalculateTotal()
复制
已复制
复制
已复制
{
{
// public int[] minimumDistance;
// public bool[] minimumDistanceExist;
int total = 0;
int total = 0;
for(int i = 0; i < 8; i++)
for(int i = 0; i < 8; i++)
{
{
if(minimumDistanceExist[i])
if(minimumDistanceExist[i])
{
{
total += minimumDistance[i] - 1;
total += minimumDistance[i] - 1;
continue;
continue;
}
}
if(i == 0)
if(i == 0)
{
{
// direction left
// direction left
total += queen.Item2;
total += queen.Item2;
}
}
复制
已复制
复制
已复制
Text moved from lines 196-199
if
(i == 2)
if(i == 1)
{
// direction up-left
total += CalculateUpLeftCount();
}
if
(i == 2)
{
{
// direction up
// direction up
total += rows - queen.Item1 - 1;
total += rows - queen.Item1 - 1;
}
}
复制
已复制
复制
已复制
if (i == 4)
{
// direction right
total += rows - queen.Item2 - 1;
}
if (i == 6)
{
// direction down
total += queen.Item1;
}
Text moved to lines 171-174
if(i == 1)
{
// direction up-left
total += CalculateUpLeftCount();
}
if(i == 3)
if(i == 3)
{
{
// direction up-right
// direction up-right
total += CalculateUpRightCount();
total += CalculateUpRightCount();
复制
已复制
复制
已复制
}
}
if(i == 4)
{
// direction right
total += rows - queen.Item2 - 1;
}
if(i == 5 )
if(i == 5 )
{
{
// direction down-right
// direction down-right
total += CalculateDownRightCount();
total += CalculateDownRightCount();
复制
已复制
复制
已复制
}
}
if(i == 6)
{
// direction down
total += queen.Item1;
}
if(i == 7)
if(i == 7)
{
{
// direction down-left
// direction down-left
total += CalculateDownLeftCount();
total += CalculateDownLeftCount();
}
}
}
}
return total;
return total;
}
}
private int CalculateUpLeftCount()
private int CalculateUpLeftCount()
{
{
int row = queen.Item1;
int row = queen.Item1;
int col = queen.Item2;
int col = queen.Item2;
int count = 0;
int count = 0;
while(row < rows -1 && col > 0)
while(row < rows -1 && col > 0)
{
{
row++;
row++;
col--;
col--;
count++;
count++;
}
}
return count;
return count;
}
}
private int CalculateUpRightCount()
private int CalculateUpRightCount()
{
{
int row = queen.Item1;
int row = queen.Item1;
int col = queen.Item2;
int col = queen.Item2;
int count = 0;
int count = 0;
while(row < rows -1 && col < rows - 1)
while(row < rows -1 && col < rows - 1)
{
{
row++;
row++;
col++;
col++;
count++;
count++;
}
}
return count;
return count;
}
}
private int CalculateDownRightCount()
private int CalculateDownRightCount()
{
{
int row = queen.Item1;
int row = queen.Item1;
int col = queen.Item2;
int col = queen.Item2;
int count = 0;
int count = 0;
while(row > 0 && col < rows - 1)
while(row > 0 && col < rows - 1)
{
{
row--;
row--;
col++;
col++;
count++;
count++;
}
}
return count;
return count;
}
}
private int CalculateDownLeftCount()
private int CalculateDownLeftCount()
{
{
int row = queen.Item1;
int row = queen.Item1;
int col = queen.Item2;
int col = queen.Item2;
int count = 0;
int count = 0;
while(row > 0 && col > 0)
while(row > 0 && col > 0)
{
{
row--;
row--;
col--;
col--;
count++;
count++;
}
}
return count;
return count;
}
}
}
}
static void Main(string[] args)
static void Main(string[] args)
{
{
ProcessInput();
ProcessInput();
//RunSampleTestcase();
//RunSampleTestcase();
//RunSampleTestcase2();
//RunSampleTestcase2();
}
}
public static void RunSampleTestcase()
public static void RunSampleTestcase()
{
{
Directions directions = new Directions(3, 3, 4);
Directions directions = new Directions(3, 3, 4);
var obstacles = new Tuple<int, int>[0];
var obstacles = new Tuple<int, int>[0];
directions.Keep8MininumObstacles(obstacles);
directions.Keep8MininumObstacles(obstacles);
Console.WriteLine(directions.CalculateTotal());
Console.WriteLine(directions.CalculateTotal());
}
}
/*
/*
* 5 3
* 5 3
* 4 3
* 4 3
* 5 5
* 5 5
* 4 2
* 4 2
* 2 3
* 2 3
*
*
*/
*/
public static void RunSampleTestcase2()
public static void RunSampleTestcase2()
{
{
Directions directions = new Directions(3, 2, 5);
Directions directions = new Directions(3, 2, 5);
var obstacles = new Tuple<int, int>[]{
var obstacles = new Tuple<int, int>[]{
new Tuple<int,int>(4,4),
new Tuple<int,int>(4,4),
new Tuple<int,int>(3,1),
new Tuple<int,int>(3,1),
new Tuple<int,int>(1,2)
new Tuple<int,int>(1,2)
};
};
directions.Keep8MininumObstacles(obstacles);
directions.Keep8MininumObstacles(obstacles);
Console.WriteLine(directions.CalculateTotal());
Console.WriteLine(directions.CalculateTotal());
}
}
public static void ProcessInput()
public static void ProcessInput()
{
{
int[] data = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
int[] data = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
int rows = data[0];
int rows = data[0];
int countObstacles = data[1];
int countObstacles = data[1];
int[] queen = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
int[] queen = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
var obstacles = new Tuple<int, int>[countObstacles];
var obstacles = new Tuple<int, int>[countObstacles];
for (int i = 0; i < countObstacles; i++)
for (int i = 0; i < countObstacles; i++)
{
{
int[] obstacle = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
int[] obstacle = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
obstacles[i] = new Tuple<int, int>(obstacle[0]-1, obstacle[1]-1);
obstacles[i] = new Tuple<int, int>(obstacle[0]-1, obstacle[1]-1);
}
}
Directions directions = new Directions(queen[0] -1, queen[1] - 1, rows);
Directions directions = new Directions(queen[0] -1, queen[1] - 1, rows);
directions.Keep8MininumObstacles(obstacles);
directions.Keep8MininumObstacles(obstacles);
Console.WriteLine(directions.CalculateTotal());
Console.WriteLine(directions.CalculateTotal());
}
}
/*
/*
* Process all obstacles one by one, determined if the obstacle is on 8 direction.
* Process all obstacles one by one, determined if the obstacle is on 8 direction.
* If it is 8 directions, then update minimum distance one.
* If it is 8 directions, then update minimum distance one.
* The total obstacles are up to 100000, we only need to keep up to 8 obstacles
* The total obstacles are up to 100000, we only need to keep up to 8 obstacles
*/
*/
public static IList<Tuple<int, int>> ProcessObstaclesKeep8withMinimuDistance(int n, int x, int y, Tuple<int,int>[] obstacles)
public static IList<Tuple<int, int>> ProcessObstaclesKeep8withMinimuDistance(int n, int x, int y, Tuple<int,int>[] obstacles)
{
{
IList<Tuple<int, int>> minimumOne = new List<Tuple<int, int>>();
IList<Tuple<int, int>> minimumOne = new List<Tuple<int, int>>();
return minimumOne;
return minimumOne;
复制
已复制
复制
已复制
}
}
}
}
}
}
已保存差异
原始文本
打开文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QueenAttack2 { class QueenAttack2 { internal class Directions { public static int[] directions_row = new int[] { -1, -1, 0, 1, 1, 1, 0, -1 }; public static int[] directions_col = new int[] { 0, -1, -1, -1, 0, 1, 1, 1 }; public int rows; public int[] minimumDistance; public bool[] minimumDistanceExist; public Tuple<int, int> queen {set; get;} public Directions(int row, int col, int size) { queen = new Tuple<int, int>(row, col); minimumDistance = new int[8]; minimumDistanceExist = new bool[8]; rows = size; } /* * left, right, up, down, or the four diagonals * 8 directions - clockwise, starting from left. */ public bool IsOneOfEightDirections( int obstacle_row, int obstacle_col) { return (obstacle_col == queen.Item2 || obstacle_row == queen.Item1 || Math.Abs(obstacle_row - queen.Item1) == Math.Abs(obstacle_col - queen.Item2) ); } /* * Go over 100000 obstacles, and find those 8 minimum one if there is. * */ public void Keep8MininumObstacles(Tuple<int,int>[] obstacles) { for(int i = 0; i < obstacles.Length; i ++) { Tuple<int, int> obstacle = obstacles[i]; if(!IsOneOfEightDirections(obstacle.Item1, obstacle.Item2)) { continue; } UpdateOneOfDirection(obstacle); } } /* * */ private void UpdateOneOfDirection(Tuple<int, int> obstacle) { bool isSameRow = obstacle.Item1 == queen.Item1; bool isSameCol = obstacle.Item2 == queen.Item2; bool isObstacleLeft = obstacle.Item2 < queen.Item2; bool isObstacleRight = obstacle.Item2 > queen.Item2; bool isObstacleUp = obstacle.Item1 > queen.Item1; bool isObstacleDown = obstacle.Item1 < queen.Item1; bool isDirectionLeft = isSameRow && isObstacleLeft; bool isDirectionRight = isSameRow && isObstacleRight; bool isDirectionUp = isSameCol && isObstacleUp; bool isDirectionDown = isSameCol && isObstacleDown; bool isDirectionUpLeft = isObstacleUp && isObstacleLeft; bool isDirectionUpRight = isObstacleUp && isObstacleRight; bool isDirectionDownLeft = isObstacleDown && isObstacleLeft; bool isDirectionDownRight = isObstacleDown && isObstacleRight; // verify left, up, right, down // direction left: if (isDirectionLeft) { int current = Math.Abs(queen.Item2 - obstacle.Item2); UpdateMinimumDistanceInfo(0, current); } if (isDirectionUp) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(2, current); } if (isDirectionRight) { int current = Math.Abs(queen.Item2 - obstacle.Item2); UpdateMinimumDistanceInfo(4, current); } if (isDirectionDown) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(6, current); } // verify 4 cross directions if (isDirectionUpLeft) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(1, current); } if (isDirectionUpRight) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(3, current); } if (isDirectionDownRight) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(5, current); } if (isDirectionDownLeft) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(7, current); } } /* * 8 directions, use directions_row, directions_col as instruction */ private void UpdateMinimumDistanceInfo(int direction, int current) { if (!minimumDistanceExist[direction]) { minimumDistanceExist[direction] = true; minimumDistance[direction] = current; } else { if (current < minimumDistance[direction]) { minimumDistance[direction] = current; } } } public int CalculateTotal() { int total = 0; for(int i = 0; i < 8; i++) { if(minimumDistanceExist[i]) { total += minimumDistance[i] - 1; continue; } if(i == 0) { // direction left total += queen.Item2; } if (i == 2) { // direction up total += rows - queen.Item1 - 1; } if (i == 4) { // direction right total += rows - queen.Item2 - 1; } if (i == 6) { // direction down total += queen.Item1; } if(i == 1) { // direction up-left total += CalculateUpLeftCount(); } if(i == 3) { // direction up-right total += CalculateUpRightCount(); } if(i == 5 ) { // direction down-right total += CalculateDownRightCount(); } if(i == 7) { // direction down-left total += CalculateDownLeftCount(); } } return total; } private int CalculateUpLeftCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row < rows -1 && col > 0) { row++; col--; count++; } return count; } private int CalculateUpRightCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row < rows -1 && col < rows - 1) { row++; col++; count++; } return count; } private int CalculateDownRightCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row > 0 && col < rows - 1) { row--; col++; count++; } return count; } private int CalculateDownLeftCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row > 0 && col > 0) { row--; col--; count++; } return count; } } static void Main(string[] args) { ProcessInput(); //RunSampleTestcase(); //RunSampleTestcase2(); } public static void RunSampleTestcase() { Directions directions = new Directions(3, 3, 4); var obstacles = new Tuple<int, int>[0]; directions.Keep8MininumObstacles(obstacles); Console.WriteLine(directions.CalculateTotal()); } /* * 5 3 * 4 3 * 5 5 * 4 2 * 2 3 * */ public static void RunSampleTestcase2() { Directions directions = new Directions(3, 2, 5); var obstacles = new Tuple<int, int>[]{ new Tuple<int,int>(4,4), new Tuple<int,int>(3,1), new Tuple<int,int>(1,2) }; directions.Keep8MininumObstacles(obstacles); Console.WriteLine(directions.CalculateTotal()); } public static void ProcessInput() { int[] data = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse); int rows = data[0]; int countObstacles = data[1]; int[] queen = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse); var obstacles = new Tuple<int, int>[countObstacles]; for (int i = 0; i < countObstacles; i++) { int[] obstacle = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse); obstacles[i] = new Tuple<int, int>(obstacle[0]-1, obstacle[1]-1); } Directions directions = new Directions(queen[0] -1, queen[1] - 1, rows); directions.Keep8MininumObstacles(obstacles); Console.WriteLine(directions.CalculateTotal()); } /* * Process all obstacles one by one, determined if the obstacle is on 8 direction. * If it is 8 directions, then update minimum distance one. * The total obstacles are up to 100000, we only need to keep up to 8 obstacles */ public static IList<Tuple<int, int>> ProcessObstaclesKeep8withMinimuDistance(int n, int x, int y, Tuple<int,int>[] obstacles) { IList<Tuple<int, int>> minimumOne = new List<Tuple<int, int>>(); return minimumOne; } } }
更改后文本
打开文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace QueenAttack2 { class QueenAttack2 { internal class Directions { public static int[] directions_row = new int[] { -1, -1, 0, 1, 1, 1, 0, -1 }; public static int[] directions_col = new int[] { 0, -1, -1, -1, 0, 1, 1, 1 }; public int rows; public int[] minimumDistance; public bool[] minimumDistanceExist; public Tuple<int, int> queen {set; get;} public Directions(int row, int col, int size) { queen = new Tuple<int, int>(row, col); minimumDistance = new int[8]; minimumDistanceExist = new bool[8]; rows = size; } /* * left, right, up, down, or the four diagonals * 8 directions - clockwise, starting from left. */ public bool IsOneOfEightDirections( int obstacle_row, int obstacle_col) { return (obstacle_col == queen.Item2 || obstacle_row == queen.Item1 || Math.Abs(obstacle_row - queen.Item1) == Math.Abs(obstacle_col - queen.Item2) ); } /* * Go over 100000 obstacles, and find those 8 minimum one if there is. * */ public void Keep8MininumObstacles(Tuple<int,int>[] obstacles) { for(int i = 0; i < obstacles.Length; i ++) { Tuple<int, int> obstacle = obstacles[i]; if(!IsOneOfEightDirections(obstacle.Item1, obstacle.Item2)) { continue; } UpdateOneOfDirection(obstacle); } } /* * */ private void UpdateOneOfDirection(Tuple<int, int> obstacle) { bool isDirectionLeft = obstacle.Item1 == queen.Item1 && obstacle.Item2 < queen.Item2; bool isDirectionRight = obstacle.Item1 == queen.Item1 && obstacle.Item2 > queen.Item2; bool isDirectionUp = obstacle.Item1 > queen.Item1 && obstacle.Item2 == queen.Item2; bool isDirectionDown = obstacle.Item1 < queen.Item1 && obstacle.Item2 == queen.Item2; bool isDirectionUpLeft = obstacle.Item1 > queen.Item1 && obstacle.Item2 < queen.Item2; bool isDirectionUpRight = obstacle.Item1 > queen.Item1 && obstacle.Item2 > queen.Item2; bool isDirectionDownRight = obstacle.Item1 < queen.Item1 && obstacle.Item2 > queen.Item2; bool isDirectionDownLeft = obstacle.Item1 < queen.Item1 && obstacle.Item2 < queen.Item2; // direction left: if (isDirectionLeft) { int current = Math.Abs(queen.Item2 - obstacle.Item2); UpdateMinimumDistanceInfo(0, current); } if (isDirectionUpLeft) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(1, current); } if (isDirectionUp) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(2, current); } if (isDirectionUpRight) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(3, current); } if (isDirectionRight) { int current = Math.Abs(queen.Item2 - obstacle.Item2); UpdateMinimumDistanceInfo(4, current); } if (isDirectionDownRight) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(5, current); } if (isDirectionDown) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(6, current); } if (isDirectionDownLeft) { int current = Math.Abs(queen.Item1 - obstacle.Item1); UpdateMinimumDistanceInfo(7, current); } } /* * 8 directions, use directions_row, directions_col as instruction */ private void UpdateMinimumDistanceInfo(int direction, int current) { if (!minimumDistanceExist[direction]) { minimumDistanceExist[direction] = true; minimumDistance[direction] = current; } else { if (current < minimumDistance[direction]) { minimumDistance[0] = current; } } } public int CalculateTotal() { // public int[] minimumDistance; // public bool[] minimumDistanceExist; int total = 0; for(int i = 0; i < 8; i++) { if(minimumDistanceExist[i]) { total += minimumDistance[i] - 1; continue; } if(i == 0) { // direction left total += queen.Item2; } if(i == 1) { // direction up-left total += CalculateUpLeftCount(); } if(i == 2) { // direction up total += rows - queen.Item1 - 1; } if(i == 3) { // direction up-right total += CalculateUpRightCount(); } if(i == 4) { // direction right total += rows - queen.Item2 - 1; } if(i == 5 ) { // direction down-right total += CalculateDownRightCount(); } if(i == 6) { // direction down total += queen.Item1; } if(i == 7) { // direction down-left total += CalculateDownLeftCount(); } } return total; } private int CalculateUpLeftCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row < rows -1 && col > 0) { row++; col--; count++; } return count; } private int CalculateUpRightCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row < rows -1 && col < rows - 1) { row++; col++; count++; } return count; } private int CalculateDownRightCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row > 0 && col < rows - 1) { row--; col++; count++; } return count; } private int CalculateDownLeftCount() { int row = queen.Item1; int col = queen.Item2; int count = 0; while(row > 0 && col > 0) { row--; col--; count++; } return count; } } static void Main(string[] args) { ProcessInput(); //RunSampleTestcase(); //RunSampleTestcase2(); } public static void RunSampleTestcase() { Directions directions = new Directions(3, 3, 4); var obstacles = new Tuple<int, int>[0]; directions.Keep8MininumObstacles(obstacles); Console.WriteLine(directions.CalculateTotal()); } /* * 5 3 * 4 3 * 5 5 * 4 2 * 2 3 * */ public static void RunSampleTestcase2() { Directions directions = new Directions(3, 2, 5); var obstacles = new Tuple<int, int>[]{ new Tuple<int,int>(4,4), new Tuple<int,int>(3,1), new Tuple<int,int>(1,2) }; directions.Keep8MininumObstacles(obstacles); Console.WriteLine(directions.CalculateTotal()); } public static void ProcessInput() { int[] data = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse); int rows = data[0]; int countObstacles = data[1]; int[] queen = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse); var obstacles = new Tuple<int, int>[countObstacles]; for (int i = 0; i < countObstacles; i++) { int[] obstacle = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse); obstacles[i] = new Tuple<int, int>(obstacle[0]-1, obstacle[1]-1); } Directions directions = new Directions(queen[0] -1, queen[1] - 1, rows); directions.Keep8MininumObstacles(obstacles); Console.WriteLine(directions.CalculateTotal()); } /* * Process all obstacles one by one, determined if the obstacle is on 8 direction. * If it is 8 directions, then update minimum distance one. * The total obstacles are up to 100000, we only need to keep up to 8 obstacles */ public static IList<Tuple<int, int>> ProcessObstaclesKeep8withMinimuDistance(int n, int x, int y, Tuple<int,int>[] obstacles) { IList<Tuple<int, int>> minimumOne = new List<Tuple<int, int>>(); return minimumOne; } } }
查找差异