3
7 8 1 6 9 2 5 4 3
算法經典
解析:個人認為是道比較經典的模擬題,很考察基本功,今天又拿來做了一下,方法就是模擬每個方向的坐標變化即可,順便推薦本書,感覺劉汝佳的《算法競賽入門經典》很適合入門的人來看哈!
貼一下自己的代碼
#includeusing std::endl; using std::cin; using std::cout; const int MAXN = 100 +10; int data[MAXN][MAXN]; int main() { #ifdef LOCAL freopen("input.txt" , "r" , stdin); freopen("output.txt" , "w" , stdout); #endif int n; while(cin >> n) { memset(data,0,sizeof(data)); int x=0 , y = n-1 , cnt = 1; data[x][y] = cnt; while(cnt < n*n) { //向下走 while(x+1 =0 && !data[x][y-1]) { data[x][--y] = ++cnt; } //向上走 while(x-1 >=0 && !data[x-1][y]) { data[--x][y] = ++cnt; } //向右走 while(y+1
蛇形填數(二)
時間限制:2000 ms | 內存限制:65535 KB 難度:3
- 描述
1 2 3 4 5 12 13 14 6 11 15 7 10 8 9跟蛇形填數一樣,只是填數要求按照三角形填。注意每組數據之間用空行隔開
- 輸入
- 第一行有一個N,表示N組測試數據
接下來每組數據包括一個數字X,表示三角形的邊長,0< X <1000- 輸出
- 輸出之後填好之後的圖
- 樣例輸入
2 5 4- 樣例輸出
1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 1 2 3 4 9 10 5 8 6 7- 來源
- NBOJ
解析:蛇形填數的變形,三角填數,本質還是模擬數字填充的方法即可哈!
貼一下自己的代碼
#include#include using std::endl; using std::cin; using std::cout; const int MAXN = 1000 + 10; int data[MAXN][MAXN]; int main() { int n; #ifdef LOCAL freopen("input.txt" , "r" , stdin); freopen("output.txt" , "w" , stdout); #endif cin >> n; while(n--) { memset(data , 0 , sizeof(data)); int length; cin >> length; int x=0 , y=0 , cnt = 1; data[x][y] = cnt; while(cnt < ((length+1)*length)/2) { //向右走 while(y+1 < length-x && !data[x][y+1]) { data[x][++y] = ++cnt; } //向對角線走 while(x+1 < length && y-1>=0 && !data[x+1][y-1]) { data[++x][--y] = ++cnt; } //向上走 while(x-1>=0 && !data[x-1][y]) { data[--x][y] = ++cnt; } } //輸出 for(int i=0; i