题目大意:左上角走到右下角,经过的路径权值连起来不能有重复,把没有重复的路径的条数加起来输出。
我自己写的时候也磕磕绊绊,主要是自己模拟一边,理明白了就好了
#include <iostream>
#include <bits/stdc++.h>
#include <map>
#include <cstring>
using namespace std;
int dr[2]={0,1};
int dc[2]={1,0};
int a[15][15];
int vis[15];
int node[15][15];
int h,w;
int ans=0;
int k=2;
map<int,int>mp;
bool pan(int x,int y){
if(x<1||x>h||y<1||y>w)return false;
else return true;
}
void dfs(int x,int y){
if(x==h&&y==w){
int flag=1;
for(int i=1;i<=h+w-1;i++){
mp[vis[i]]=0;
}
for(int i=1;i<=h+w-1;i++){
mp[vis[i]]++;
if(mp[vis[i]]>1)flag=0;
}
if(flag==1)ans++;
// memset(vis,0,sizeof(vis));
vis[1]=a[1][1];
return ;
}
for(int i=0;i<2;i++){
int nr=x+dr[i];
int nc=y+dc[i];
if(pan(nr,nc)&&node[nr][nc]==0){
node[nr][nc]=1;
vis[k]=a[nr][nc];
k++;
dfs(nr,nc);
k--;
vis[k]=0;
node[nr][nc]=0;
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>h>>w;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>a[i][j];
}
}
// cout<<a[1][1]<<endl;
// for(int i=1;i<=h;i++){
// for(int j=1;j<=w;j++){
// cout<<a[i][j]<<" ";
// }
// cout<<endl;
// }
//
vis[1]=a[1][1];
dfs(1,1);
cout<<ans;
return 0;
}