Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

请各位帮忙看看这个内存为什么会爆 我看了解题报告上面用21*21*16000+的静态数组都没爆啊

Posted by ADmiaomiao at 2012-08-01 01:02:01 on Problem 1324
#include<iostream>
#include<queue>
#include<memory>
#include<string>
using namespace std;
int flag[21][21];
int sign[21][21];
int drec[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int wi,hi,body;
int limit;
int pro=1;
struct snake
{
	int x,y;
};
struct co
{
	int x,y,step;
	snake bdlh[8]; //保存当前位置蛇的坐标
};
co r,w;
void refresh()
{
		memset(flag,0,sizeof(flag));
		memset(sign,0,sizeof(sign));
}

bool uj(int x,int y)
{
   if(x>=1&&x<=wi&&y>=1&&y<=hi)
	   if(flag[x][y]==0)
		   if(!sign[x][y])
			   return true;
		   return false;
}


void movedeal()//移动处理//处理之后重新设置一边模拟数组
{
	int i;//!!
	snake tail,change;//!!
	tail.x=w.x;
	tail.y=w.y;
	w=r;
	w.x=tail.x;
	w.y=tail.y;
      for(i=0;i<body;i++)
		  {
		         change=w.bdlh[i];
                 w.bdlh[i]=tail;
				 //cout<<"("<<w.bdlh[i].x<<","<<w.bdlh[i].y<<")";
				 tail=change;
		  }//换位
	  //cout<<endl;
	  w.step=r.step+1;
		for(i=0;i<body;i++)
		{
			flag[w.bdlh[i].x][w.bdlh[i].y]=2;
		}
      flag[tail.x][tail.y]=0;
}

void movedealt()
{
	int i,j;
     	for(i=1;i<=wi;i++)
		for(j=1;j<=hi;j++)
		{
			if(flag[i][j]==2)
			flag[i][j]=0;
		}
		for(i=0;i<body;i++)
		{
			flag[r.bdlh[i].x][r.bdlh[i].y]=2;
		}
}

bool bfs()
{
	int i=0;
    queue<co>path;
	r.x=r.bdlh[0].x;
	r.y=r.bdlh[0].y;
	r.step=0;
	path.push(r);//入列
	while(!path.empty())
	{
		r=path.front();
		movedealt();
		path.pop();
		for(i=0;i<4;i++)
		{
			movedealt();
			w.x=r.x+drec[i][0];
			w.y=r.y+drec[i][1];
			if(r.x==1&&r.y==1)//条件判断 如果头一开始就在11;
			{
                printf("Case %d: %d\n",pro++,w.step-1);
				return true;
			}
			w.step=r.step+1;
			if(uj(w.x,w.y))
			{
               sign[r.x][r.y]=1;
			   movedeal();
			   path.push(w);
			}
            while(uj(w.x,w.y))
			{
                w.x+=drec[i][0];
			   w.y+=drec[i][1];
			   w.step++;
			}
			if(w.x==1&&w.y==1)
			{
				printf("Case %d: %d\n",pro++,w.step);
				return true;
			}
		}
	}
	return false;
}
 
bool in()
{
	refresh();
	int x,y;
	int i=0;
    cin>>wi>>hi>>body;
    if(!(wi||hi||body))
	return false;
	for(i=0;i<body;i++)
	{
		cin>>x>>y;
		flag[x][y]=2;
		r.bdlh[i].x=x;
		r.bdlh[i].y=y;//将蛇身的坐标保存下来方便进行移动时的处理
	}
	cin>>limit;
	for(i=0;i<limit;i++)
	{
        cin>>x>>y;
		flag[x][y]=1000;
	}
	return true;
}

int main()
{
    while(in())
	{
       if(!bfs())
        printf("Case %d: -1\n",pro++);
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator