1703 压力释放器

描述
做助教压力很大,题出太难会被不会做的同学骂,多出一些做过的题目激励同学们平时练习会被当场有把握做出来的同学骂,出没见过的题目会被所有同 学骂,查代码会被参考别人代码的同学骂...最近两位助教心理压力实在太大,于是跑到心理咨询室,想请医生给点招。医生很快拿出一个叫压力释放器的东西, 即一个M*N的棋盘。棋盘上每个棋子代表压力值。

释放器使用是这样子的:

从最左边一列任意一个棋子开始,可以拿右边一列的3个棋子,即右上,右,右下3个棋子。如果拿的是第1行或第M行棋子的话,我们称此情况为“穿越”
拿到的棋子之和即为总压力值。

自然,我们希望压力值最小,同时,路径的字典序需要最小(字典序在数据结构中上过,希望你还记得),你能帮助两位助教使用释放器吗?


输入

T组数据(T<=10)

每组数据保证M<=100&&N<=100

保证总合在int范围内

输出

第一行为路径,每个数字Pi代表取走了第i列第Pi行的棋子

如SAMPLE所示,即取走了第1列第1个,第2列第5个

样例输入
1
5 2
5 1
6 2
4 3
5 -1
9 -3
 
样例输出
1 5
2
#include <iostream>
using namespace std;
int a[102][102];
int p[102][102];
void printPath(int m, int i, int n)
{
    cout << p[m][i] << ' ';
    if(i < n-1)
        printPath(p[m][i], i+1, n);
}
int main()
{
    int t;
    int m, n;
    cin >> t;
    int i, j;
    while(t --)
    {
        cin >> m >> n;
        for(i = 1; i <= m; i ++)
            for(j = 1; j <= n; j ++)
                cin >> a[i][j];
        for(i = n-1; i >= 1; i --)
            for(j = 1; j <= m; j ++)
            {
                int temp = j;
                if(j == m)
                {
                    if(j-1 > 0 && a[j-1][i+1] <= a[temp][i+1])
                        temp = j-1;
                    if(a[1][i+1] <= a[temp][i+1])
                        temp = 1;
                }
                else if(j == 1)
                {
                    if(j+1 < m && a[j+1][i+1] < a[temp][i+1])
                        temp = j + 1;
                    if(a[m][i+1] < a[temp][i+1])
                        temp = m;
                }
                else
                {
                    if(a[j-1][i+1] <= a[temp][i+1])
                        temp = j - 1;
                    if(a[j+1][i+1] < a[temp][i+1])
                        temp = j + 1;
                }
                p[j][i] = temp;
                a[j][i] += a[temp][i+1];
            }
        int mi = a[1][1];
        int mm = 1;
        for(i = 2; i <= m; i ++)
            if(mi > a[i][1])
            {
                mi = a[i][1];
                mm = i;
            }
        if(n == 0 || m == 0)
        {
            cout << "0\n";
            continue;
        }
        cout << mm << ' ';
        if(n > 1)
            printPath(mm, 1, n);
        cout << '\n';
        cout << mi << '\n';
    }
    return 0;
}


 

 

 

 

你可能感兴趣的:(1703 压力释放器)