题目描述
给定M×N的矩阵,其中的每个元素都是-10到10之间的整数。你的任务是从左上角(1,1)走到右下角(M,N),每一步只能够向右或者向下,并且不能够走出矩阵的范围。你所经过的方格里面的数字都必须被选取,请找出一条最合适的道路,使得在路上被选取的数字之和是尽可能小的正整数。
输入
输入第1行是两个整数M和N,(2<=M<=10,2<=N<=10),分别表示矩阵的行和列的数目。接下来M行,每行包括N个整数,就是矩阵中的每一行的N个元素。
输出
输出只有一行,就是一个整数,表示所选道路上数字之和所能达到的最小正整数。如果不能达到任何正整数,输出-1。
示例输入
2 2 0 2 1 0
示例输出
1#include<stdio.h> #include<string.h> int bj[13][13], map[13][13], min = 10000000, sum = 0; int n, m; int dx[] = {0,1}, dy[] = {1,0}; void dfs(int x1, int y1) { if(x1 == n && y1 == m) { if(sum > 0 && sum < min) min = sum; } else { int i; for(i = 0; i < 2; i++) { int kx, ky; kx = x1 + dx[i]; ky = y1 + dy[i]; if(kx <= n && ky <= m && !bj[kx][ky]) { sum += map[kx][ky]; bj[kx][ky] = 1; dfs(kx,ky); bj[kx][ky] = 0; sum -= map[kx][ky]; } } } } int main() { int i, j; while(~scanf("%d%d",&n,&m)) { memset(bj,0,sizeof(bj)); memset(map,0,sizeof(map)); for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) scanf("%d",&map[i][j]); min = 10000000; sum = map[1][1]; dfs(1,1); if(min == 10000000) printf("-1\n"); else printf("%d\n",min); } return 0; }