PuyoPuyo(DFS算法)

修改后的代码段,原来是替换数组的时候没把输出的数组在while循环一次的结尾清空掉,导致数据保留了

 #include<iostream>
int board_width;
int mark1[10][10];
int mark[10][10];
int map[10][10];
int map1[10][10]={0};
int tail[10]={0};
struct tagInfo
{
    int event;
    int dir;
    int col;
    int val[2];
}tInfo;
struct Point
{
    int x;
    int y;
};
Point drop[1000];
void newBlock(int block[2])
{
    tInfo.event=1;
    tInfo.dir=0;
    tInfo.col=0;
    tInfo.val[0]=block[0];
    tInfo.val[1]=block[1];
}
void rotate(int angle)
{
    tInfo.dir=(tInfo.dir+angle)%4;
if(tInfo.dir==0&&tInfo.col==board_width-1)
{
    tInfo.col=board_width-2;
}
if(tInfo.dir==2&&tInfo.col==0)
{
    tInfo.col=1;
}
}
void move(int distance)
{
    tInfo.col+=distance;
    if(tInfo.col>=1&&tInfo.col<=board_width-2) return;
        if(tInfo.dir==0&&tInfo.col==board_width-1)
        {
            tInfo.col=board_width-2;
            return;
        }
        if(tInfo.dir==2&&tInfo.col<=0)
        {
            tInfo.col=1;
            return;
        }
        if(tInfo.col>board_width-1)
        {
            tInfo.col=board_width-1;
            return;
        }
        if(tInfo.col<0)
        {
            tInfo.col=0;
            return;
        }
}
void hinder(int count,int life)
{
    tInfo.event=2;
    for(int i=0;i<count;i++)
    {
        map[i][tail[i]++]=-1*life;
    }
}
 
void init(int width)
{
    board_width=width;
    for(int i=0;i<board_width;i++)
    {
             tail[i]=0;
             }
}
 
dfs(int x,int y,int num)
{
     if(map[x-1][y]==map[x][y]&&mark1[x-1][y]==0)
     {   
         mark1[x-1][y]=1;
         num=dfs(x-1,y,num)+1;
     }
     if(map[x][y+1]==map[x][y]&&mark1[x][y+1]==0)
     {
         mark1[x][y+1]=1;
         num=dfs(x,y+1,num)+1;
     }
     if(map[x+1][y]==map[x][y]&&mark1[x+1][y]==0)
     {
         mark1[x+1][y]=1;
         num=dfs(x+1,y,num)+1;
     }
     if(map[x][y-1]==map[x][y]&&mark1[x][y-1]==0)
     {
         mark1[x][y-1]=1;
         num=dfs(x,y-1,num)+1;
     }
return num;
}
 
void mark2(int x,int y)
{
    for(int i=0;i<board_width;i++)
    {
        for(int j=0;j<tail[i];j++)
        {
            mark1[i][j]=0;
        }
    }
    mark1[x][y]=1;
}
void clear()
{
    for(int i=0;i<board_width;i++)
    {
        for(int j=0;j<tail[i];j++)
        {
            if(mark1[i][j])
            {
                map[i][j]=0;
            }
        }
        printf("\n");
    }
}
int updatemap()
{int c=1,s=0,sum=0;
    for(int i=0;i<board_width;i++)
    {
        for(int j=0;j<tail[i];j++)
        {
            if(map[i][j]==0)
            {
                while(map[i][j+c]==0&&j+c<tail[i])
                {
                    c++;            
                }
                if(j+c==tail[i])
                {
                    tail[i]=j;
                    break;
                }
                map[i][j]=map[i][j+c];
                drop[s].x=i;
                drop[s++].y=j;
                sum++;
                map[i][j+c]=0;
                c=1;
            }
        }
    }
return sum;
}
int check(int i,int j)
{
    if(map[i-1][j]==0&&i-1>=0)    return 1;
    if(map[i][j+1]==0&&j+1<tail[i]) return 1;
    if(map[i+1][j]==0&&i+1<board_width) return 1;
    if(map[i][j-1]==0&&j-1>=0) return 1;
    return 0;
}
static void markhinder()
{
    for(int i=0;i<board_width;i++)
    {
        for(int j=0;j<tail[i];j++)
        {
            if(map[i][j]<0)
            {
                if(check(i,j))
                {
                    map[i][j]+=1;
                    mark[i][j]=map[i][j]==0?0:1;
                }
            }
        }
    }
}
 
static void solution(Point L,Point R)
{int dfs_search_num;
    int drop_num=2;
    drop[0]=L;
    drop[1]=R;
    while(drop_num!=0)
    {
        for(int i=0;i<drop_num;i++)
        {
            if(mark[drop[i].x][drop[i].y]==1||map[drop[i].x][drop[i].y]==0) continue;
            dfs_search_num=1;
             mark2(drop[i].x,drop[i].y);
        dfs_search_num=dfs(drop[i].x,drop[i].y,dfs_search_num);
            if(dfs_search_num>=4)
            {
                clear();
            }
            
            dfs_search_num=1;
        }
        drop_num=updatemap();
    }
}
 
 
 
int land()
{
    Point pt1,pt2;
    if(tInfo.event==1)
    {
        switch(tInfo.dir)
        {
        case 0:
            {
                pt1.x=tInfo.col;
                pt1.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
                pt2.x=tInfo.col+1;
                pt2.y=tail[tInfo.col+1];
                map[tInfo.col+1][tail[tInfo.col+1]++]=tInfo.val[1];
             break;
            }
        case 1:
            {
                pt2.x=tInfo.col;
                pt2.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[1];
                pt1.x=tInfo.col;
                pt1.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
                break;
            }
        case 2:
            {
                pt1.x=tInfo.col;
                pt1.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
                pt2.x=tInfo.col-1;
                pt2.y=tail[tInfo.col-1];
                map[tInfo.col-1][tail[tInfo.col-1]++]=tInfo.val[1];
                break;
            }
        case 3:
            {
                pt1.x=tInfo.col;
                pt1.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
                pt2.x=tInfo.col;
                pt2.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[1];
                break;
            }
 
        }
    solution(pt1,pt2);
    }
    int j=0;
    for(int i=0;i<board_width;i++)
    {
        j=tail[i]>j?tail[i]:j;
    }
    return j;
}
int main()
{
    int s,a,d,c,l,m;
 
    int block[2]={6,9};
    printf("pls input the width of this game:");
    scanf("%d",&s);
    init(s);
        while(1){
    newBlock(block);
    printf("pls input the angle:");
    scanf("%d",&a);
    rotate(a);
    printf("pls input the distance:");
    scanf("%d",&d);
    move(d);
    m=land();
                
    for(int i=0;i<board_width;i++)
    {
        for(int j=9;j>9-tail[i];j--)
        {
            map1[j][i]=map[i][9-j];
        }
    }
    for(int z=0;z<10;z++)
    {
        for(int j=0;j<board_width;j++)
        {
            if(map1[z][j])
            {
                printf("%d",map1[z][j]);
            }
            else printf(" ");
        }
        printf("\n");
    }
        
        for(int q=0;q<10;q++)
    {
        for(int p=0;p<10;p++)  // 输出后清空替代数组,不然后续源数组dfs清空之后,tail变小,导致

                                               输出的数组没有清空,因此要在循环的结尾主动清空一次。
        {
         map1[q][p]=0;
        }
    }
        
        }
    printf("game over score:%d",m);
    return 0;
}
 

#include<iostream>
int board_width;
int mark1[10][10];
int mark[10][10];
int map[10][10];
int map1[10][10]={0};
int tail[10]={0};
struct tagInfo
{
	int event;
	int dir;
	int col;
	int val[2];
}tInfo;
struct Point
{
	int x;
	int y;
};
Point drop[10];
void newBlock(int x)
{
	tInfo.event=1;
	tInfo.dir=0;
	tInfo.col=0;
	tInfo.val[0]=x;
	tInfo.val[1]=++x;
}
void rotate(int angle)
{
	tInfo.dir=(tInfo.dir+angle)%4;
if(tInfo.dir==0&&tInfo.col==board_width-1)
{
	tInfo.col=board_width-2;
}
if(tInfo.dir==2&&tInfo.col==0)
{
	tInfo.col=1;
}
}
void move(int distance)
{
	tInfo.col+=distance;
	if(tInfo.col>=1&&tInfo.col<=board_width-2) return;
		if(tInfo.dir==0&&tInfo.col==board_width-1)
		{
			tInfo.col=board_width-2;
			return;
		}
		if(tInfo.dir==2&&tInfo.col<=0)
		{
			tInfo.col=1;
			return;
		}
		if(tInfo.col>board_width-1)
		{
			tInfo.col=board_width-1;
		    return;
		}
		if(tInfo.col<0)
		{
			tInfo.col=0;
			return;
		}
}
void hinder(int count,int life)
{
	tInfo.event=2;
	for(int i=0;i<count;i++)
	{
		map[i][tail[i]++]=-1*life;
	}
}

void init(int width)
{
	board_width=width;
	for(int i=0;i<board_width;i++)
	{
             tail[i]=0;
			 }
}

dfs(int x,int y,int num)
{
	 if(map[x-1][y]==map[x][y]&&mark1[x-1][y]==0)
	 {   
		 mark1[x-1][y]=1;
		 num=dfs(x-1,y,num)+1;
	 }
	 if(map[x][y+1]==map[x][y]&&mark1[x][y+1]==0)
	 { 
		 mark1[x][y+1]=1;
		 num=dfs(x,y+1,num)+1;
	 }
	 if(map[x+1][y]==map[x][y]&&mark1[x+1][y]==0)
	 {
		 mark1[x+1][y]=1;
		 num=dfs(x+1,y,num)+1;
	 }
     if(map[x][y-1]==map[x][y]&&mark1[x][y-1]==0)
	 {
		 mark1[x][y-1]=1;
		 num=dfs(x,y-1,num)+1;
	 }
return num;
}

void mark2(int x,int y)
{
	for(int i=0;i<board_width;i++)
	{
		for(int j=0;j<tail[i];j++)
		{
			mark1[i][j]=0;
		}
	}
	mark1[x][y]=1;
}
void clear()
{
	for(int i=0;i<board_width;i++)
	{
		for(int j=0;j<tail[i];j++)
		{
			if(mark1[i][j])
			{
				map[i][j]=0;
			}
		}
	}
}
int updatemap()
{int c=1,s=0,sum=0;
	for(int i=0;i<board_width;i++)
	{
		for(int j=0;j<tail[i];j++)
		{
			if(map[i][j]==0)
			{
				while(map[i][j+c]==0&&j+c<tail[i])
				{
					c++;			
				}
				if(j+c==tail[i])
				{
					tail[i]=j;
					break;
				}
				map[i][j]=map[i][j+c];
				drop[s].x=i;
				drop[s++].y=j;
				sum++;
				map[i][j+c]=0;
				c=1;
			}
		}
	}
return sum;
}
int check(int i,int j)
{
	if(map[i-1][j]==0&&i-1>=0)	return 1;
	if(map[i][j+1]==0&&j+1<tail[i]) return 1;
	if(map[i+1][j]==0&&i+1<board_width) return 1;
    if(map[i][j-1]==0&&j-1>=0) return 1;
	return 0;
}
static void markhinder()
{
	for(int i=0;i<board_width;i++)
	{
		for(int j=0;j<tail[i];j++)
		{
			if(map[i][j]<0)
			{
				if(check(i,j))
				{
					map[i][j]+=1;
					mark[i][j]=map[i][j]==0?0:1;
				}
			}
		}
	}
}

static void solution(Point L,Point R)
{int dfs_search_num;
	int drop_num=2;
	drop[0]=L;
	drop[1]=R;
	while(drop_num!=0)
	{
		for(int i=0;i<drop_num;i++)
		{
			if(mark[drop[i].x][drop[i].y]==1||map[drop[i].x][drop[i].y]==0) continue;
			dfs_search_num=1;
			 mark2(drop[i].x,drop[i].y);
		dfs_search_num=dfs(drop[i].x,drop[i].y,dfs_search_num);
			if(dfs_search_num>=4)
			{
				clear();
			}
			dfs_search_num=1;
		}
		drop_num=updatemap();
	}
}



int land()
{
	Point pt1,pt2;
	if(tInfo.event==1)
	{
		switch(tInfo.dir)
		{
		case 0:
			{
				pt1.x=tInfo.col;
				pt1.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
				pt2.x=tInfo.col+1;
				pt2.y=tail[tInfo.col+1];
                map[tInfo.col+1][tail[tInfo.col+1]++]=tInfo.val[1];
             break;
			}
		case 1:
			{
				pt2.x=tInfo.col;
				pt2.y=tail[tInfo.col];
				map[tInfo.col][tail[tInfo.col]++]=tInfo.val[1];
				pt1.x=tInfo.col;
				pt1.y=tail[tInfo.col];
                map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
				break;
			}
		case 2:
			{
				pt1.x=tInfo.col;
				pt1.y=tail[tInfo.col];
				map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
				pt2.x=tInfo.col-1;
				pt2.y=tail[tInfo.col-1];
				map[tInfo.col-1][tail[tInfo.col-1]++]=tInfo.val[1];
				break;
			}
		case 3:
			{
				pt1.x=tInfo.col;
				pt1.y=tail[tInfo.col];
				map[tInfo.col][tail[tInfo.col]++]=tInfo.val[0];
				pt2.x=tInfo.col;
				pt2.y=tail[tInfo.col];
				map[tInfo.col][tail[tInfo.col]++]=tInfo.val[1];
				break;
			}

		}
	solution(pt1,pt2);
	}
	int j=0;
	for(int i=0;i<board_width;i++)
	{
		j=tail[i]>j?tail[i]:j;
	}
	return j;
}
int main()
{
	int s,a,d,c,l,m;


	printf("pls input the width of this game:");
	scanf("%d",&s);
	init(s);
		while(1){
	newBlock(4);
	printf("pls input the angle:");
	scanf("%d",&a);
	rotate(a);
	printf("pls input the distance:");
	scanf("%d",&d);
	move(d);
	m=land();
	for(int i=0;i<board_width;i++)
	{
		for(int j=9;j>9-tail[i];j--)
		{
			map1[j][i]=map[i][9-j];
		}
	}
	for(int z=0;z<10;z++)
	{
		for(int j=0;j<board_width;j++)
		{
			if(map1[z][j])
			{
				printf("%d",map1[z][j]);
			}
			else printf(" ");
		}
		printf("\n");
	}
		}
	printf("game over score:%d",m);
	return 0;
}

代码能运行,但递归消除有些bug,后续再改进。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值