UVA225Golygons 黄金图形
生活随笔
收集整理的這篇文章主要介紹了
UVA225Golygons 黄金图形
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:平面上有k個障礙點。從(0,0)出發(fā),第一次走一個單位,第二次走2個單位,····第n次走n個單位,恰好回到(0,0)點。要求只能沿著東南西北方向走,且每次必須轉彎90度(不能沿一個方向繼續(xù)走,也不能后退)。走出的圖形可以自交但不能經過障礙點,已經訪問過的點不能再訪問。輸入n、k(1n20,0k50)和所有障礙點的坐標,所有滿足條件的移動序列(用news,表示北、東、西、南),按照字典序從小到大輸出,最后輸出移動序列總數(shù)。
分析:本題是一道典型的回溯題,需剪枝,當當前的坐標到原點的x和y的距離和大于可以移動的步數(shù),剪枝。按照四個方向搜索,每次搜索都判斷是否經過障礙物。訪問過的點不能再訪問。
#include<cstdio> #include<cstring> #include<cctype> #include<queue> #include<iostream> #include<vector> #include<list> #include<set> using namespace std; const int maxn = 300; int originx = 150, originy = 150;//坐標原點 int G[maxn][maxn]; int n; char route[maxn]; int rous; int dy[] = { 0,1,-1,0 }; int dx[] = { 1,0,0,-1 }; char dir[] = { 'e','n','s','w' }; int vis[maxn][maxn]; void solve(int cur,int x,int y,int direction) {if (cur == n + 1) {if (x == originx && y == originy) {for (int i = 1; i <= n; i++)cout << route[i];cout << endl;rous++;}return;}if (cur > n + 1)return;for (int i = 0; i < 4; i++) {if (i == direction||i==3-direction)continue;int ddx = x + dx[i] * cur;int ddy = y + dy[i] * cur;if (vis[ddx][ddy])continue;if((n - cur)*(n + cur + 1) / 2<(abs(ddx-originx)+abs(ddy-originy)))continue;int ok = 0;int a1, a2,a;if (ddx == x) { a = x; a1 = y; a2 = ddy; }else { a = y; a1 = x; a2 = ddx; }if (a1 > a2) swap(a1, a2);for (int j = a1; j <= a2; j++) {if (ddx == x)if (G[a][j]) {ok = 1; break;}if (ddy == y)if (G[j][ddy]) {ok = 1; break;}}if (!ok) {route[cur] = dir[i];vis[ddx][ddy] = 1;solve(cur + 1, ddx, ddy, i);vis[ddx][ddy] = 0;}} } int main() {int kase;cin >> kase;while (kase-- > 0) {memset(G, 0, sizeof(G));memset(vis, 0, sizeof(vis));rous = 0;cin >> n;int bar,barx,bary;cin >> bar;for (int i = 0; i < bar; i++) {cin >> barx >> bary;G[barx + originx][bary + originy] = 1;}solve(1, originx, originy, -1);cout << "Found " << rous << " golygon(s)." << endl;cout << endl;}//system("pause");return 0; }?
總結
以上是生活随笔為你收集整理的UVA225Golygons 黄金图形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA208Firetruck 消防车(
- 下一篇: UVA211 TheDomino Eff