hdu-1175连连看 无限WA 很无奈 求 大牛指教 链接http:⼀⼀acm.hdu.edu.cn⼀showproblem.php?pid=1175

2025-01-03 01:05:27
推荐回答(4个)
回答1:

//hdoj 1175 连连看

//修改了一下你代码,A了
#include
#include
#include
using namespace std;
typedef struct shit
{
int i,j,turn,dir;
}node;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int maze[1005][1005];
char visit[1005][1005];
int main()
{
freopen("in.txt","r",stdin);
node now;
int m,n;
char find;
int c;
int i,j;
int si,sj,ei,ej;
while(scanf("%d%d",&m,&n)&&(m||n))
{
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&maze[i][j]);
}
}
scanf("%d",&c);
while(c--)
{
scanf("%d%d%d%d",&si,&sj,&ei,&ej);
if(maze[si][sj]!=maze[ei][ej]||maze[si][sj]==0)
{
printf("NO\n");
continue;
}
queue q;
node temp;
now.i=si;
now.j=sj;
now.turn=-1;
now.dir=-1;
q.push(now);
find=0;
// memset(visit,-1,sizeof(visit));
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
visit[i][j]=4;
visit[si][sj]=0;
while(!q.empty()&&!find)
{
temp=q.front();
q.pop();
if(temp.i==ei&&temp.j==ej&&temp.turn<=2)
{
//printf("i:%d j:%d dir:%d turn:%d\n",now.i,now.j,now.dir,now.turn);
find=1;
break;
}
int M=q.size();
for(i=0;i<4;i++)
{
now.i=temp.i+dir[i][0];
now.j=temp.j+dir[i][1];
now.dir=i;
if(now.dir!=temp.dir)
now.turn=temp.turn+1;
else
now.turn=temp.turn;

if(now.i>=1&&now.i<=m&&now.j>=1&&now.j<=n&&now.turn<=2&&(!maze[now.i][now.j]||(now.i==ei&&now.j==ej)))
{

/* if(visit[now.i][now.j]==-1)
{
visit[now.i][now.j]=0;
q.push(now);
continue;

}*/
if(visit[now.i][now.j]>=now.turn)
{
//printf("i:%d j:%d dir:%d turn:%d\n",now.i,now.j,now.dir,now.turn);
visit[now.i][now.j]=now.turn;
q.push(now);
}
}
}
}
if(find)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}

有几点错误。 还有 memset(visit,4,sizeof(visit));
并不是 给visit[i][j] 赋值4,这样只能赋值 -1,0,1

回答2:

因为Windows的开发者自己定义了CHAR和TCHAR,他们自己定义的CHAR是unsigned char,为了防止不同编译器产生不同的代码,因为C标准并没有规定说char必须是不是unsigned的。所以自己固定一种比较好。而且为了兼容DOS下对8位扩展ASCII码处理,应该是0~255的范围。-128~127的char只是早期C语言编译器习惯的定义,这个定义微软的C编译器也继承了,但是OS开发者和编译器团队都想要一些独立性。

回答3:

我有ac的,在zoj上过的
http://blog.csdn.net/creativewang/article/details/6632272
zoj上是2411,题目基本一样

回答4:

安师大