关闭

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

1029人阅读 评论(2) 收藏 举报

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


 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:125292次
    • 积分:2371
    • 等级:
    • 排名:第16300名
    • 原创:115篇
    • 转载:11篇
    • 译文:3篇
    • 评论:13条
    常用链接
    最新评论