| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
为什么地图不能是20*20的我用board[20][20]来记录地图,结果就WA了,自己试了题目给的数据都是对的
后面看了别人的都是21,25,30的边长,我就改成了21,然后就A了,想知道原因
自己看了下程序在执行的时候也不会产生越界的情况啊(下面的程序已经+1了,没+1的通不过)
#include<cstdio>
#include<algorithm>
using std::lower_bound;
using std::sort;
const int MAX_W=20, MAX_H=20, MAX_DATA_SETS=100;
int h,w,board[MAX_H+1][MAX_W+1];
int sx,sy;
int dx[4]={-1,1,0,0}, dy[4]={0,0,1,-1};
int ans[MAX_DATA_SETS+1],ansCnt;
bool inBoard(int x,int y)
{
if(x>=0 && x<h && y>=0 && y<w) return 1;
return 0;
}
int dfs(int x, int y, int t)
{
if(t==10) return -1;
int res[4];
for(int i=0;i<4;i++){
int nx=x+dx[i], ny=y+dy[i];
if(!inBoard(nx,ny)|| board[nx][ny]==1) {
res[i]=-1;
continue;
} else {
while(board[nx][ny]!=1){
if(board[nx][ny]==3) {
res[i]=1;
break;
}
nx+=dx[i];
ny+=dy[i];
if(!inBoard(nx,ny)) {
res[i]=-1;
break;
}
}
if(board[nx][ny]==1){
board[nx][ny]=0;
res[i]=dfs(nx-dx[i],ny-dy[i],t+1);
if(res[i]!=-1) res[i]++;
board[nx][ny]=1;
}
}
}
sort(res,res+4);
int *p=lower_bound(res,res+4,0);
if(p==res+4) return -1;
else return *p;
}
int main()
{
while(1){
scanf("%d%d",&w,&h);
memset(board,0,sizeof(board));
if(!w && !h) break;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
scanf("%d",&board[i][j]);
if(board[i][j]==2){
sx=i;sy=j;
}
}
}
ans[ansCnt]=dfs(sx,sy,0);
ansCnt++;
}
for(int i=0;i<ansCnt;i++)
printf("%d\n",ans[i]);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator