第四届河南省程序设计竞赛 迷宫问题

原创 2012年03月30日 21:05:44

额,刚开始有指导说用动态规划,而我也觉得dp 是可解的,但是后来提交时WA,用了一组测试数据发现存在漏洞 。例如: 3  1 0 0  1 0 0 1 0 0

后来又有人说用搜索,可是自己却感觉搜素不可行的,不过结果是可想而知的。。。。。。

题目链接

 

#include<stdio.h> 
#include<string.h> 
#define SIZE_N 101 
#define INF_MAX 0x7fffffff 
int Map[SIZE_N][SIZE_N],vis[SIZE_N][SIZE_N]; 
int n,H,L,flag; 
int dir[4][2]={1,0,-1,0,0,1,0,-1}; 
void DFS(int x,int y) 
{
 int i,xx,yy;   
 if(flag)return ;
 vis[x][y]=1;  
 if(Map[x][y]<L||Map[x][y]>H)   
  return ;  
 if(x==n&&y==n){   
  flag=1;      
  return;   
 }   
 for(i=0;i<4;i++){   
  xx=x+dir[i][0];   
  yy=y+dir[i][1];   
  if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&!vis[xx][yy]){    
   DFS(xx,yy);    
  }   
 } 
} 
int main() 
{  
 int i,j; 
 int max,min;  
 int hight,mid,low;  
 while(scanf("%d",&n)!=EOF){   
  min=INF_MAX,max=-1;   
  for(i=1;i<=n;i++){   
   for(j=1;j<=n;j++){              
    scanf("%d",&Map[i][j]);     
    if(Map[i][j]<min)min=Map[i][j];     
    if(Map[i][j]>max)max=Map[i][j];   
   }   
  }  
  hight=max-min;low=0;      
  while(hight>=low){
   mid=(hight+low)/2;
   for(i=min;i<=max-mid;i++){
    H=i+mid;L=i;flag=0;     
    memset(vis,0,sizeof(vis));                
    DFS(1,1);     
    if(flag)break;
   }
   if(i<=max-mid)hight=mid-1;
   else low=mid+1;
  }       
  printf("%d\n",hight+1);   
 }  
 return 0; 
}


下面是我写的dp 版

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define MAX 1000
#define MIN 0
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y

using namespace std;

int a[102][102];   
int mi[102][102], ma[102][102];

int dp(int n)
{
    int i, j, k;
    for(i=1; i<=n; i++)
    for(j=1; j<=n; j++)
    cin>>a[i][j];
   
     for(j=1; j<n; j++)
     {
     mi[0][j] = min(a[1][j],a[1][j+1]);
     ma[0][j] = max(a[1][j],a[1][j+1]);
     }
    for(i=1; i<n; i++)
    {
    mi[i][0] = min(a[i][1],a[i+1][1]);
    ma[i][0] = max(a[i][1],a[i+1][1]);
    }
    
    ma[1][2] = mi[1][2]= ma[2][1] = mi[2][1] = a[1][1];
    for(i=2; i<=n; i++)
    for(j=2; j<=n; j++)
    {
      if( (max(ma[i-1][j],a[i][j])- min(mi[i-1][j],a[i][j]) ) < (max(ma[i][j-1],a[i][j])- min(mi[i][j-1],a[i][j])) )
       {
       mi[i][j]= min(mi[i-1][j],a[i][j]);
       ma[i][j]= max(ma[i-1][j],a[i][j]);
       }
       else
       {
        mi[i][j]= min(mi[i][j-1],a[i][j]);
        ma[i][j]= max(ma[i][j-1],a[i][j]);
       }
    }
 return ma[n][n] - mi[n][n];
}
int main()
{
    int n;
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
    int k = dp(n);
    printf("%d\n",k);
    }
   system("pause");
   return 0;
}


 

相关文章推荐

NYoj303 第四届河南省程序设计竞赛

这道题是昨天晚上看的,当时感觉挺难得,后来想了想,发现就是个进制得问题,有了基本思路。今天早上又稍微想了一下,思路已经非常清晰了。下课之后,开始写代码,之后就是个悲剧,,,一直有问题,好不容易把所有情...
  • wmn_wmn
  • wmn_wmn
  • 2011年08月31日 13:30
  • 1404

2016河南省第九届ACM程序设计竞赛,问题 E: 机器设备

题目链接:http://acm.codedream.ren/JudgeOnline/ 问题 E: 机器设备 时间限制: 1 Sec  内存限制: 64 MB 提交: 11  解决: 5 [...

2014年第四届“华为杯”南邮程序设计竞赛,选拔赛第二题 亲友团问题

题目B:亲友团问题 时间限制(普通/Java):6000MS/18000MS          运行内存限制:65536KByte 问题描述 在2014“华为杯”南邮大学生团体歌唱大赛每一个轮比...

河南省第四届程序设计大赛--Substring

描述 You are given a string input. You are to find the longest substring of input such that the revers...

nyoj305表达式求值(第四届河南省程序设计大赛)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数...

第四届河南省程序设计大赛-表达式求值,双栈过!

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3                                                    ...

NYOJ-303-序号互换(第四届河南省程序设计大赛A题(模拟))

序号互换 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算...

河南省第四届ACM程序设计大赛(共八道,目前只做两道。待续)

1630: 序号互换 时间限制: 1 Sec  内存限制: 128 MB 提交: 65  解决: 26 [提交][状态] 题目描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第四届河南省程序设计竞赛 迷宫问题
举报原因:
原因补充:

(最多只允许输入30个字)