返回题目问答
讨论 / 题目问答/ 帖子详情

为什么第九个测试案例超时了

#include <bits/stdc++.h>
using namespace std;
const int N = 12;
int n,k;
int mp[N][N];
bool vis[N][N];
int dir[8][2] = {-1,0, -1,1, 0,1, 1,1, 1,0, 1,-1, 0,-1, -1,-1};

vector<string> res;
set<pair<pair<int,int>, pair<int,int>>> s;
string ans;

void dfs(int x,int y,int num,int cnt)
{
  if(x == n && y == n && cnt != n*n)
  {
    return ;
  }
  if(cnt == n*n && x == n && y == n)
  {
    res.push_back(ans);
    return ;
  }
  for(int i = 0;i<8;i++)
  {
    int nx = x + dir[i][0];
    int ny = y + dir[i][1];
    if(nx<1 || ny <1 || nx>n || ny>n || vis[nx][ny] || mp[nx][ny] != (num+1)%k) continue;
    if(i%2)
    {
      if(s.find({{x,ny},{nx,y}}) != s.end() || s.find({{nx,y},{x,ny}}) != s.end())
      {
        continue;
      }     
    }
    ans += i + '0';
    s.insert({{x,y},{nx,ny}});
    vis[nx][ny] = true;
    dfs(nx,ny,mp[nx][ny],cnt+1);
    vis[nx][ny] = false;
    s.erase({{x,y},{nx,ny}});
    ans.pop_back();
  }
}

int main()
{
  cin>>n>>k;
  for(int i = 1;i<=n;i++)
  for(int j = 1;j<=n;j++)
    cin>>mp[i][j];
  vis[1][1] = true;
  dfs(1,1,mp[1][1],1);
  if(res.size() == 0)
  {
    cout<<-1;
    return 0;
  }
  sort(res.begin(), res.end());
  cout<<res[0];
  return 0;
}
0 回复 0 转发 0 喜欢 8 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!