#广搜#麻将游戏(ssl 1786)

 

  在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。
  这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性:
  1. 它由若干条线段组成,每条线段要么是水平方向,要么是垂直方向。
  2. 这条路径不能横穿任何一个麻将牌 (但允许路径暂时离开平板)。
  这是一个例子:

  在(1,3)的牌和在(4, 4)的牌可以被连接。(2, 3)和(3, 4)不能被连接。

 

  你的任务是编一个程序,检测两张牌是否能被一条符合以上规定的路径所连接。 

题意:输出两点之间路径的最少线段数量。(最少转弯次数+1)(当然,可能走不了)

 

Source

Problem Id:1786  User Id:xiongjunqi
Memory:1308K  Time:0MS
Language:G++  Result:Accepted

  • Source

     

    #include 
    using namespace std;
    int n,m,x1,x2,y1,y2;
    const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
    unsigned short father[6401],stat[6401][3]; unsigned short a[81][81],c[81][81];
    void bfs(){
    	int head=0,tail=1; father[1]=0; a[x2][y2]=0x7fff;
    	do{
    		head++;
    		for (int i=0;i<4;i++){
    			int x=stat[head][1]+dx[i],y=stat[head][2]+dy[i]; a[x2][y2]=0x7fffff;
    			if (x>=0&&y>=0&&x<=n+1&&y<=m+1)
    			while (a[x][y]>=stat[head][0]+1){ //封路<>求最小步数
    				tail++;
    				father[tail]=head;
    			    stat[tail][1]=x;
    			    stat[tail][2]=y;
    			    a[x][y]=stat[head][0]+1;
    			    stat[tail][0]=stat[head][0]+1;
    			    if (x==x2&&y==y2){
    				    printf("%d\n",stat[tail][0]);
    				    return;
    			    }
    			    x+=dx[i];
    			    y+=dy[i];
    			}
    		}
    	}while (head

     

 

你可能感兴趣的:(搜索)