zoukankan      html  css  js  c++  java
  • ZOJ 1107 FatMouse and Cheese

    原题链接

    题目大意:FM在一个街道n*n街道的(0,0)点,在每个网格里放着cheese,他要尽可能多的吃这些cheese。有两个规则:1)他跑的总距离不能超过k步;2)下一个节点的cheese的块数必须超过这个节点。

    解法:题目是去年秋天做的,现在看了下貌似就是用一下广搜,从原点开始一个个查找。我直接把当时的代码贴过来了,看看当时写的注释,发现暑假都过了一半了,算法都没有总结好。惭愧了。

    参考代码:

    #include<string.h>
    using namespace std;
    
    int n,k,x,y,block[102][102],dp[102][102];
    int a[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    
    int BSF(int, int);
    
    int main(){
    	int i,j;
    
    	while(cin>>n>>k){
    		if(n==-1&&k==-1) break;
    		x=y=1;
    		memset(block,-1,sizeof(block));
    		for(i=1;i<=n;i++)
    			for(j=1;j<=n;j++)
    				cin>>block[i][j];
    		memset(dp,-1,sizeof(dp));
    		BSF(1,1);
    		cout<<dp[1][1]<<endl;
    	}
    
    
    	return 0;
    }
    
    int BSF(int x, int y){
    	int i,j,max,sx,sy,temp;
    	if(dp[x][y]!=-1){
    		return dp[x][y];
    	}
    	else{
    		max=0;
    		for(i=0;i<4;i++){
    			for(j=1;j<=k;j++){
    				sx=x+a[i][0]*j;
    				sy=y+a[i][1]*j;
    				if(sx<1||sx>n||sy<1||sy>n)continue;	//这个判断很重要,不然超出数组边界就要segmental fault了
    				if(block[sx][sy]>block[x][y]){
    					temp=BSF(sx,sy);
    					if(max<temp) max=temp;
    				}
    			}
    		}
    		dp[x][y]=max+block[x][y];	//递归函数的返回处理最讨厌了
    		return dp[x][y];
    	}
    }
  • 相关阅读:
    ARTS-S mac终端ftp命令行上传下载文件
    tensorflow SavedModelBuilder用法
    linux限定用户目录及权限
    软件测试准入准出规则
    weblogic 12c重置console密码
    linux exec和xargs的区别
    linux加域退域
    centos 6.6 配置xdmcp远程桌面
    shell数组中“和@的妙用
    【原创】Centos 7利用软件Raid搭建ISCSI过程
  • 原文地址:https://www.cnblogs.com/naive/p/3568786.html
Copyright © 2011-2022 走看看