| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5541 人关注过本帖
标题:第十八期编程比赛
只看楼主 加入收藏
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
晕.
不只你这两组错误数据太多了.继续改.就不信了

2007-09-15 22:40
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 

这是我写的代码,老长了....
确实wa,不过不晓得为什么...

程序代码:

#include<stdio.h>
#define MAX_M 8
#define MAX_N 8
#define INFINITY 300

#define UN_CHECKED -1
#define UN_USED -2
#define BLOCK '#'
#define BLANK '.'
#define SMALL_MONSTER 'o'
#define BIG_MONSTER 'O'

#define push(x,y,v) disX[y][x] =(v); \
queue[tail][0] =(x); \
queue[tail++][1] =(y);
char map[MAX_N][MAX_M+1];
char pos[MAX_N*MAX_M][2];
int disX[MAX_N][MAX_M];

int disB[MAX_N*MAX_M];

//动态规划之用 disT[m][n][k]表示从m到n历经k个节点的最短距离
// distT[m][n][k] =min{disT[m][i][2]+disT[i][n][k-1] ;其中disN[m][n][k-1]中不含i}
int disT[MAX_N*MAX_M][MAX_N*MAX_M][MAX_N*MAX_M];
//动态规划之用 dist[m][n][k][..]表示记录从m到n经历的节点
char disN[MAX_N*MAX_M][MAX_N*MAX_M][MAX_N*MAX_M][MAX_N*MAX_M];
char queue[MAX_N*MAX_M][2];

void calculateDist(int sx,int sy,int width,int height){
int head =0,tail =0,d;
push(sx,sy,0);
while(head<tail){
sx =queue[head][0];
sy =queue[head++][1];
d =disX[sy][sx];
if(sy-1>=0&&disX[sy-1][sx]==UN_CHECKED){
push(sx,sy-1,d+1);
}
if(sy+1<height&&disX[sy+1][sx]==UN_CHECKED){
push(sx,sy+1,d+1);
}
if(sx-1>=0&&disX[sy][sx-1]==UN_CHECKED){
push(sx-1,sy,d+1);
}
if(sx+1<width&&disX[sy][sx+1]==UN_CHECKED){
push(sx+1,sy,d+1);
}

}
}
//将BIG Monster设为block
void translateA(int width,int height){
for(int y =0;y<height;y++)
for(int x =0;x<width;x++)
if(map[y][x]==BLOCK||map[y][x]==BIG_MONSTER) disX[y][x] =UN_USED;
else disX[y][x] =UN_CHECKED;
}
//将big monster设为blank
void translateB(int width,int height){
for(int y =0;y<height;y++)
for(int x =0;x<width;x++)
if(map[y][x]==BLOCK) disX[y][x] =UN_USED;
else disX[y][x] =UN_CHECKED;
}
//计算小鬼到终点的距离
void calculateDistB(int width,int height,int smallCount){
for(int index=0;index<smallCount;index++){
translateB(width,height);
calculateDist(pos[index][0],pos[index][1],width,height);
disB[index] =disX[height-1][width-1]>=0?disX[height-1][width-1]:INFINITY;
}
}
//计算任意两个小鬼的最短距离
void calculateDistA(int width,int height,int smallCount){
for(int index=0;index<smallCount;index++){
translateA(width,height);
calculateDist(pos[index][0],pos[index][1],width,height);
for(int p =0;p<smallCount;p++){
disT[index][p][2] =disX[pos[p][1]][pos[p][0]]>=0?disX[pos[p][1]][pos[p][0]]:INFINITY;
disN[index][p][2][0] =index;
disN[index][p][2][1] =p;
}
}
}
//...
void dp(int width,int height,int smallCount,int num){
for(int k=3;k<=num;k++)
for(int m=0;m<smallCount;m++)
for(int n=0;n<smallCount;n++){
if(m==n) continue;
disT[m][n][k] =INFINITY;
for(int p=0;p<smallCount;p++){
if(p==m||p==n) continue;
bool flags =true;
for(int index =1;index<k-1;index++)
if(m ==disN[p][n][k-1][index]){
flags =false;
break;
}
if(!flags) continue;
if(disT[m][n][k]>disT[m][p][2]+disT[p][n][k-1]){
disT[m][n][k]=disT[m][p][2]+disT[p][n][k-1];
disN[m][n][k][0] =m;
for(int j=1;j<k;j++) disN[m][n][k][j] =disN[p][n][k-1][j-1];
}
}
}
}
int getPos(int width,int height,int &num){
if(map[0][0]!=SMALL_MONSTER){
map[0][0] =SMALL_MONSTER;
num ++;
}
int count =0;
for(int y=0;y<height;y++)
for(int x=0;x<width;x++)
if(map[y][x] ==SMALL_MONSTER){
pos[count][0] =x;
pos[count][1] =y;
count ++;
}
return count;
}
void readMap(int height){
for(int y =0;y<height;y++) scanf(\"%s\",map[y]);
}

int main(){
int width,height,num;
int minDist,smallCount;
while(scanf(\"%d%d%d\",&width,&height,&num)!=EOF){
readMap(height);
if(map[0][0]==BLOCK||(num!=0&&map[0][0]==BIG_MONSTER)){ //这里修改了下
printf(\"-1\n\");
continue;
}
translateA(width,height);
calculateDist(0,0,width,height);
minDist =disX[height-1][width-1]>=0?disX[height-1][width-1]:INFINITY;

smallCount =getPos(width,height,num);
if(smallCount<num){
printf(\"%d\n\",minDist<INFINITY?minDist+1:-1);
continue;
}
else if(num<=1){
translateB(width,height);
calculateDist(0,0,width,height);
printf(\"%d\n\",disX[height-1][width-1]>=0?disX[height-1][width-1]+1:-1);
continue;
}
calculateDistB(width,height,smallCount);
calculateDistA(width,height,smallCount);
dp(width,height,smallCount,num);
for(int index=1;index<smallCount;index++)
if(minDist>disB[index]+disT[0][index][num]) minDist =disB[index]+disT[0][index][num];
printf(\"%d\n\",minDist<INFINITY?minDist+1:-1);
}
}


[此贴子已经被作者于2007-9-15 23:49:19编辑过]


My BlogClick Me
2007-09-15 23:32
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
以下是引用ACKing在2007-9-15 22:19:04的发言:

2 2 0
..
.O

4 4 3
o...
....
o..o
o#OO

你的输出好像差1吧

这个不是3和7吗?


My BlogClick Me
2007-09-15 23:35
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 

我和你有点不同.我是把打了k个怪保存在'O'上.
我尝试一下把它保存到'o'上看看


2007-09-15 23:38
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
以下是引用Eastsun在2007-9-15 23:35:41的发言:

这个不是3和7吗?

是DI


2007-09-15 23:39
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
谁帮我搞个错误测试数据来..

My BlogClick Me
2007-09-15 23:41
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
2 2 0
#.
..

算不?

2007-09-15 23:41
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
以下是引用crackerwang在2007-9-15 23:41:43的发言:
2 2 0
#.
..

算不?

唔...确实
改了下,再试试..


My BlogClick Me
2007-09-15 23:50
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 

要熄灯了


2007-09-15 23:56
zmfttkl
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-7-1
收藏
得分:0 

啊!有点意思哈!


2007-09-16 10:29
快速回复:第十八期编程比赛
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019259 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved