1. 程式人生 > 實用技巧 >HDU 6813 Last Problem (構造+dfs)

HDU 6813 Last Problem (構造+dfs)

題意:有個無限大的畫板,初始均為空,張三想畫出數字n,如果他想畫下數字n(n5)n(n≥5),需要保證四周的數字為n1,n2,n3,n4如果n≤4,只需要保證大於0的數字出現在四周即可,輸出可以畫出n的步驟。必然是有解的。n<100

題解:n很小,且必然有解,可以考慮確定一個n的位置對其四周開始dfs,但是搜尋的順序不是無序必須保證n-1與n-4(n-2和n-3)分隔在n的兩側才能保證搜尋之間不會相互覆蓋。

#include <bits/stdc++.h>
#define IO_read ios::sync_with_stdio(false);cin.tie(0)
#define
fre freopen("C:\\in.txt", "r", stdin) #define _for(i,a,b) for(int i=a; i< b; i++) #define _rep(i,a,b) for(int i=a; i<=b; i++) #define inf 0x3f3f3f3f #define lowbit(a) ((a)&-(a)) using namespace std; typedef long long ll; template <class T> void read(T &x) { char c; bool op=0;
while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1; x=c-'0'; while(c=getchar(), c>='0'&&c<='9') x=x*10+c-'0'; if(op) x=-x; } template <class T> void write(T x) { if(x<0) putchar('-'), x=-x; if(x>=10) write(x/10); putchar('0'+x%10); } const int maxn=1e3+5;
int n, pos[maxn][maxn]; int dx[]={0, -1, 1, 0}, dy[]={-1, 0, 0, 1}; void dfs(int x, int y, int val) { if(val<=0) return; _for(k, 0, 4){ int nx=x+dx[k], ny=y+dy[k]; if(pos[nx][ny]!=val-k-1) dfs(nx, ny, val-k-1); } pos[x][y]=val; printf("%d %d %d\n", x, y, val); } int main() { freopen("out.txt", "w", stdout); clock_t st, ed; read(n); st=clock(); dfs(500, 500, n); ed=clock(); //printf("%f", (double)(ed-st)/CLOCKS_PER_SEC); return 0; }