2022年计挑赛C语言 迷宫问题

现有一个n*m的地图,地图上每个格子有一个正整数表示该格子的幸运值。 小明初始时站在地图左上角((1,1)的位置),同时面朝右方,他每次去往一个相邻(上下左右)且没有被经过的格子,若是他前往的格子方向是自己面朝的方向,则不需要转向,否则需要消耗一张转向卡,且小明最开始拥有k张转向卡。小明经过的所有格子中的数字按照顺序拼接起来就是他得到的总的幸运值,比如他经过了(1,45,37,21)四个格子,幸运值就为1453721。 。请问若是小明需要幸运值为7的倍数,请问他有多少种不同的路径可以走?(不需要走到底,符合条件可以随时停下) 。 输入格式: 第一行依次输入三个数字n,m,k分别表示地图大小和转向卡的数量( 接下来n行输入m个正整数,空格间隔开,表示每个格子上的幸运值 输出格式: 能够实现总幸运值为7的倍数时的不同路径数量 输入样例1: 2 3 2 79 8 12 31 10 5 输入样例2: 2 3 1 79 8 12 31 10 5 输出样例1: 4 输出样例2: 2

C++解法:

#include 

using namespace std;


int ans = 0;//最终路径数量
int dx[4] = {1,-1,0,0};//x方向
int dy[4] = {0,0,1,-1};//y方向
bool flag[1000][1000];//标记是否经过
int n,m,k;


//判断当前位置是否合法
bool isLegal(int x,int y){
    if(x>=0&&x<m&&y>=0&&y<n){
        return true;
    }
    return false;
}

//统计路径
void countPath(const vector<vector<int>>& data,int x,int y,string cs,int d,int k){
    flag[y][x] = true;
    if(stoull(cs)%7==0){
        ans ++;
        cout<<ans<<endl;
    }

    for(int i=0;i<4;i++){
        int nx = x+dx[i];
        int ny = y+dy[i];
        if(isLegal(nx,ny)&&!flag[ny][nx]){
            if(d!=i&&k>0){
                countPath(data,nx,ny,cs+to_string(data[ny][nx]),i,k-1);
                flag[ny][nx] = false;
            }else if(d==i){
                countPath(data,nx,ny,cs+to_string(data[ny][nx]),i,k);
                flag[ny][nx] = false;
            }
        }
    }

}

int main(){

    cin>>n>>m>>k;
    vector<vector<int>> data(n,vector<int>(m,0));

    for(int i=0;i<n;i++)    for(int j=0;j<m;j++){
        cin>>data[i][j];
        flag[i][j] = false;
    }
    countPath(data,0,0,to_string(data[0][0]),0,k);
    cout<<ans;
}

你可能感兴趣的:(c语言,算法,java)