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

额,刚开始有指导说用动态规划,而我也觉得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;
}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值