Problem Description
《連連看》是由一款益智類游戲熊尉。
《連連看》只要將相同的兩張牌用三根以內(nèi)的直線連在一起就可以消除,規(guī)則簡單容易上手。
本題編寫程序模擬人進行連連看游戲,電腦模擬人玩連連看的過程如下:
1、分析本局游戲喧伞,將本局游戲轉(zhuǎn)化成一個二位數(shù)組。0表示空白區(qū)域绩郎,數(shù)字表示該游戲牌為出現(xiàn)在游戲中的第幾類游戲牌潘鲫。
2、利用廣度優(yōu)先搜索算法嗽上,判斷兩個游戲牌是否可以消除次舌。
3、程序模擬人點擊可以消除的一對游戲牌進行消除兽愤。
對某局游戲轉(zhuǎn)化成二維數(shù)組如下:
0 0 0 0 0
0 1 2 0 0
0 0 3 4 0
0 0 0 1 0
輸入二位數(shù)組的行彼念、列,二位數(shù)組浅萧、起始元素的的坐標逐沙、終止元素的坐標,判斷起始游戲牌和終止游戲牌是否可以消除洼畅。
輸入
4 5
0 0 0 0 0 0 1 2 0 0 0 0 3 4 0 0 0 0 1 0
1 1
3 3
輸出
TRUE
AcCode
//
// main.cpp
// 連連看游戲輔助
//
// Created by jetviper on 2017/3/26.
// Copyright ? 2017年 jetviper. All rights reserved.
//
#include <stdio.h>
#define up 1
#define down 2
#define left 3
#define right 4
int chess[1000][1000]={0};
int reach[1000][1000]={0};
int n,l;
int startx,starty,endx,endy;
void bfs(int x,int y,int count,int way){
if(count>3||x<0||y<0||x>(n-1)||y>(l-1))return;
if(chess[x][y]!=chess[startx][starty]&&chess[x][y]!=0)return;
if(reach[x][y]==0||reach[x][y]>=count){
reach[x][y]=count;
switch(way){
case up:{
bfs(x-1,y,count,up);
bfs(x,y+1,count+1,right);
bfs(x+1,y,count+1,down);
bfs(x,y-1,count+1,left);
break;
}
case right:{
bfs(x-1,y,count+1,up);
bfs(x,y+1,count,right);
bfs(x+1,y,count+1,down);
bfs(x,y-1,count+1,left);
break;
}
case down:{
bfs(x-1,y,count+1,up);
bfs(x,y+1,count+1,right);
bfs(x+1,y,count,down);
bfs(x,y-1,count+1,left);
break;
}
case left:{
bfs(x-1,y,count+1,up);
bfs(x,y+1,count+1,right);
bfs(x+1,y,count+1,down);
bfs(x,y-1,count,left);
break;
}
}
}
}
int main() {
scanf("%d%d",&n,&l);
for(int i =0;i<n;i++)
for(int j=0;j<l;j++){
scanf("%d",&chess[i][j]);
}
scanf("%d%d%d%d",&startx,&starty,&endx,&endy);
bfs(startx,starty,1,up);
bfs(startx,starty,1,right);
bfs(startx,starty,1,down);
bfs(startx,starty,1,left);
if(reach[endx][endy]>0){
printf("TRUE\n");
}
else {
printf("FALSE\n");
}
return 0;
}