元素的坐標(biāo)來自二維數(shù)組的 i斥废,j。而通過 i蚜退,j 可以取到元素類型
前面講連通方式分三種:直連闰靴,一折連,二折連
直連:
從圖中可以看出規(guī)律钻注,直連的兩個元素蚂且,同行或同列( i相等 或者 j相等 ) ,把 i、j轉(zhuǎn)換成坐標(biāo) point 就是 point(i, j)
直連邏輯方法如下:
* 直連
* pointA:點(diǎn)擊的其中一個元素
* pointB:點(diǎn)擊的另一個元素
* data:數(shù)據(jù)圖
*/
+ (BOOL)oneConnectionWithCGPoint:(CGPoint)pointA pointB:(CGPoint)pointB data:(NSMutableArray *)data{
//如果同行
NSInteger minValue = -1;
NSInteger maxValue = -1;
//同行
if (pointA.x == pointB.x) {
//相鄰
if (fabs(pointA.y - pointB.y) == 1) {
return YES;
}
//判斷哪個值大小
if (pointA.y > pointB.y) {
minValue = pointB.y;
maxValue = pointA.y;
}
else{
maxValue = pointB.y;
minValue = pointA.y;
}
//遍歷數(shù)據(jù)minValue 與 maxValue 之間的數(shù)值 如果為0代表通路 否則有阻礙
if (pointA.x > data.count) {
return NO;
}
NSMutableArray *list = data[(NSInteger)pointA.x];
for (NSInteger i = minValue + 1; i < maxValue; i++){
NSNumber *number = list[I];
if ([number integerValue] != 0) {
return NO;
}
}
}
//同列
else if (pointA.y == pointB.y){
//相鄰
if (fabs(pointA.x - pointB.x) == 1) {
return YES;
}
//判斷哪個值大小
if (pointA.x > pointB.x) {
minValue = pointB.x;
maxValue = pointA.x;
}
else{
maxValue = pointB.x;
minValue = pointA.x;
}
//遍歷數(shù)據(jù)minValue 與 maxValue 之間的數(shù)值 如果為0代表通路 否則有阻礙
if (pointA.y > data.count) {
return NO;
}
for (NSInteger i = minValue + 1; i < maxValue; i++){
NSMutableArray *list = data[I];
NSNumber *number = list[(NSInteger)pointA.y];
if ([number integerValue] != 0) {
return NO;
}
}
}
else{
return NO;
}
return YES;
}
直連邏輯做了以下幾件事
1.判斷是同行還是同列( x 相等還是 y 相等)
2.如果同行幅恋,判斷兩個元素的 y 差值是不是為1杏死,為1證明挨著,可以連成功
3.如果同行捆交,判斷兩個元素之間淑翼,是否有元素在,如果有(不等于0)零渐,則有其他元素存在窒舟,連不成功。如果沒有诵盼,則沒有任何元素存在惠豺,就是通路银还,連成功
4.同列的話差不多的邏輯
一折連:
從圖中可以看出規(guī)律:
0:拐點(diǎn)就是圖中的直角點(diǎn),比如我從1連到1洁墙,必然要轉(zhuǎn)彎蛹疯,轉(zhuǎn)彎的點(diǎn)就是拐點(diǎn)
1:如果為一折連的話,必有兩個拐點(diǎn)热监。
2:如果一折連連成功的話捺弦,兩個拐點(diǎn)必有一個拐點(diǎn)是0,也就是沒有圖片占據(jù)孝扛。
那么試想一下列吼,如果我點(diǎn)擊兩個元素A1和B1(也就是上圖的兩個1),然后取它們的兩個拐點(diǎn)p1和 p2苦始,然后將它們分別與A1和B1進(jìn)行 直連寞钥,如果兩個拐點(diǎn)有一個成功,那么A1和 B1是不是就算連成功了陌选?答案:是的
一折連邏輯方法如下:
/**
* 一折連
* pointA:點(diǎn)擊的其中一個元素
* pointB:點(diǎn)擊的另一個元素
* data:數(shù)據(jù)圖
*/
+(BOOL)twoConnectionWithCGPoint:(CGPoint)pointA pointB:(CGPoint)pointB data:(NSMutableArray *)data{
CGPoint point1 = CGPointMake(pointA.x, pointB.y);//取第一個拐點(diǎn)
CGPoint point2 = CGPointMake(pointB.x, pointA.y);//取第二個拐點(diǎn)
NSArray *list = data[(NSInteger)point1.x];
NSNumber *number = list[(NSInteger)point1.y];
if ([number integerValue] == 0) {//判斷第一個拐點(diǎn)的位置是不是通路(通路為0)
//拿到拐點(diǎn)分別和要進(jìn)行一折連的兩個點(diǎn) 進(jìn)行直連判斷 如果都能直連 可以一折連
BOOL flagA = [self oneConnectionWithCGPoint:point1 pointB:pointB data:data];
BOOL flagB = [self oneConnectionWithCGPoint:point1 pointB:pointA data:data];
if (flagA && flagB){
NSLog(@"拐點(diǎn):%@", NSStringFromCGPoint(point1));
NSLog(@"pointA : %@", NSStringFromCGPoint(pointA));
NSLog(@"pointB : %@", NSStringFromCGPoint(pointB));
return YES;
}
}
list = data[(NSInteger)point2.x];
number = list[(NSInteger)point2.y];
if ([number integerValue] == 0) {//判斷第二個拐點(diǎn)的位置是不是通路(通路為0)
//拿到拐點(diǎn)分別和要進(jìn)行一折連的兩個點(diǎn) 進(jìn)行直連判斷 如果都能直連 可以一折連
BOOL flagA = [self oneConnectionWithCGPoint:point2 pointB:pointB data:data];
BOOL flagB = [self oneConnectionWithCGPoint:point2 pointB:pointA data:data];
if (flagA && flagB){
NSLog(@"%@", NSStringFromCGPoint(point2));
NSLog(@"pointA : %@", NSStringFromCGPoint(pointA));
NSLog(@"pointB : %@", NSStringFromCGPoint(pointB));
return YES;
}
}
return NO;
}
一折連邏輯做了以下幾件事
1.取 A 的 x 及 B 的 y成第一個拐點(diǎn)
2.取 B 的 x 及 A 的 y成第二個拐點(diǎn)
3.分別拿兩個拐點(diǎn)和 A理郑、B 進(jìn)行直連
二折連:
上面一折連跟直連產(chǎn)生了關(guān)系,那么二折連也是一樣的邏輯咨油。遍歷其中一個點(diǎn) A 上您炉、下、左役电、右的所有點(diǎn)只要與另一個點(diǎn) B 連一折連連成功赚爵,就算二折連成功
**
* 兩折連
* pointA:點(diǎn)擊的其中一個元素
* pointB:點(diǎn)擊的另一個元素
* data:數(shù)據(jù)圖
*/
+(BOOL)thirdConnectionWithCGPoint:(CGPoint)pointA pointB:(CGPoint)pointB data:(NSMutableArray *)data{
NSInteger row = data.count;
NSInteger col = [[data lastObject] count];
//左
for (NSInteger i = pointA.y - 1; i >= 0; i--) {
NSArray *list = data[(NSInteger)pointA.x];
NSNumber *number = list[i];
if ([number integerValue] != 0) {
break;
}
BOOL flag = [self twoConnectionWithCGPoint:CGPointMake(pointA.x, i) pointB:pointB data:data];
if (flag) {
return flag;
}
}
//右
for (NSInteger i = pointA.y + 1; i < col; i++) {
NSArray *list = data[(NSInteger)pointA.x];
NSNumber *number = list[i];
if ([number integerValue] != 0) {
break;
}
BOOL flag = [self twoConnectionWithCGPoint:CGPointMake(pointA.x, i) pointB:pointB data:data];
if (flag) {
return flag;
}
}
//上
for (NSInteger i = pointA.x - 1; i >= 0; i--) {
NSArray *list = data[i];
NSNumber *number = list[(NSInteger)pointA.y];
if ([number integerValue] != 0) {
break;
}
BOOL flag = [self twoConnectionWithCGPoint:CGPointMake(i, pointA.y) pointB:pointB data:data];
if (flag) {
return flag;
}
}
//下
for (NSInteger i = pointA.x + 1; i < row; i++) {
NSArray *list = data[i];
NSNumber *number = list[(NSInteger)pointA.y];
if ([number integerValue] != 0) {
break;
}
BOOL flag = [self twoConnectionWithCGPoint:CGPointMake(i, pointA.y) pointB:pointB data:data];
if (flag) {
return flag;
}
}
return NO;
}
最后附上demo地址