主要问题是输入之后回车,迟迟没有结果,疑似卡进循环里了。
:
内存限制:50MB
时间限制:5.00s
题目背景:
炎炎夏日,旅行者、菲谢尔、枫原万叶和辛焱一行人来到金苹果群岛度假,探索辽阔无垠、美丽丰饶的海岛。菲谢尔从鉴亭书院杨源一博士处得知,只要找到16个海螺,就能获得风度翩翩华冠丽服鹑衣百结的永夜断罪新衣装。菲谢尔十分喜欢这套衣装,委托旅行者帮忙寻找海螺。但是旅行者肩负调查愚人众营地的任务,必须尽快找到海螺。旅行者身体虚弱,无法下水,只能在陆地上行进。
抽象化题意:
在一个n行m列的平面内,有x个海螺每一个整数点可表示为(i,j),i∈[1,n],j∈[1,m]。以0标志海岛中可行进的陆地,1表示不能行进的海域(map[1][1]!=1),9表示海螺。输入一张地图,角色从地图左上角出发,输出最少步数(地图中1个单位向量为1步)
1<=x<=16
4<=n,m<=114
由于旅行者脑容量有限,内存限制为50Mib,又因为它很忙,时间限制5.00s。
int map[115][115],n,m;//地图和地图大小
int target_x[17],target_y[17];//海螺横纵坐标
int dt_x[4]={0,1,0,-1};
int dt_y[4]={1,0,-1,0};//顺时针试探
int v[115][115],vv[17];//v:标志是否走过 vv:海螺是否被排列
int minn=114*114,temp_min=114*114;//sum=0;//sum:最短步数
int turn[17];//访问海螺的顺序,tunr【0】=0,从起点开始,用于控制target数组
void dfs(int x,int y,int x1,int y1,int step){
int x2,y2;//下一步新起点坐标
if(x==x1&&y==y1){
if(step<minn)minn=step;
return;
}
else{
for(int i=0;i<4;i++){
if(v[x+dt_x[i]][y+dt_y[i]]==0&&map[x+dt_x[i]][y+dt_y[i]]==0){//走的过程中比当前最小值大了,return
x2=x+dt_x[i];
y2=y+dt_y[i];
v[x2][y2]==1;
dfs(x2,y2,x1,y1,step+1);
v[x2][y2]==0;
}
if(step>minn)return;
}
}
}
int init(){
cin>>n>>m;
int k=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
if(map[i][j]==9){
k++;
target_x[k]=i;
target_y[k]=j;
}
}
}
return k;
}//k个海螺,经过k+1个点
int nums=init();//nums个海螺
void settle(){
for(int i=0;i<=nums-1;i++){
dfs(target_x[i],target_y[i],target_x[i+1],target_y[i+1],1);
}
return;
}
int search(int k){//实现海螺全排列
int i;
for(i=1;i<=nums;i++) {
if(!vv[i]){
turn[k]=i;
vv[i]=1;
if(k==nums)settle();
else search(k+1);
vv[i]=0;
}
}
}
int main(int argc, char** argv) {
target_x[0]=1;
target_y[0]=1;
cout<<minn;
return 0;
}