修改后的代码段,原来是替换数组的时候没把输出的数组在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,后续再改进。