注意两点,如果想要让字典序输出,那么选择的时候,就按照字典序来选择就可以了
第二点:这种有明显的阶段的使用DFS更自然一点(比如树也是这样)
#include<cstdio> #include<set> #include<queue> #include<algorithm> using namespace std; typedef pair<int ,int>PII; vector<PII>V; int longest; const int maxn = 1000; char turn[] = {'e','n','s','w'};//先往东走 char ans[maxn]; PII walk(char c,int cur,int x,int y) { if(c == 'e') { return make_pair(x + cur,y); } if(c == 'n') { return make_pair(x,y + cur); } if(c == 's') { return make_pair(x,y - cur); } if(c == 'w') { return make_pair(x - cur,y); } } int cnt = 0; void print_ans() { cnt++; for(int i = 1;i <= longest;i++) { printf("%c",turn[ans[i]]); } printf("\n"); } bool is_blocked(PII p,int x,int y) { if(p.first == x)//在一竖行 { for(int i = 0;i < V.size();i++) { if(V[i].first == x && V[i].second <= max(p.second,y) && V[i].second >= min(p.second,y)) { return true; } } } else if(p.second == y)//在一横行 { for(int i = 0;i < V.size();i++) { if(V[i].second == y && V[i].first <= max(p.first,x) && V[i].first >= min(p.first,x)) return true; } } return false; } void DFS(int x,int y,int cur) { if(cur == longest + 1) { if(x == 0 && y == 0) print_ans(); } else { for(int i = 0;i < 4 ;i++) { if(i == ans[cur - 1]) { continue; } if(i == 0 && ans[cur - 1] == 3 || i == 3 && ans[cur - 1] == 0) { continue; } if(i == 1 && ans[cur - 1] == 2 || i == 2 && ans[cur - 1] == 1) { continue; } PII p = walk(turn[i],cur,x,y); if(is_blocked(p,x,y))//走到了障碍物上了 { continue; } else { ans[cur] = i; DFS(p.first,p.second,cur + 1); } } } } int main() { freopen("input.txt","r",stdin); int kase; int num_kase = 0; scanf("%d",&kase); for(int i = 0;i < kase;i++) { printf("case%d\n",++num_kase); int block; cnt = 0; ans[0] = 5; V.clear(); scanf("%d%d",&longest,&block); for(int i = 0;i < block;i++) { int x,y; scanf("%d%d",&x,&y); PII p = make_pair(x,y); V.push_back(p);//障碍也建好了 } DFS(0,0,1); printf("%d\n",cnt); } return 0; }