網易筆試 程式設計
阿新 • • 發佈:2019-02-16
1 一片1000*1000的草地,初始站在(1,1)(最左上角),每一秒小易都會橫向或縱向到相鄰草地吃草(不會越界),反派超超手上有n個陷阱,第i個陷阱位置(xi,yi),小易一旦進陷阱就會被捕獲,為解救小易,請計算小易最少多少秒可能會走入一個陷阱,提前提醒小易
輸入描述:第一行:n:超超的陷阱數
第二行:n個整數xi,表示陷阱橫座標
第三行:n個整數yi,表示陷阱縱座標(座標均在範圍內)
#include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <queue> #include <limits.h> using namespace std; #define N 1005 struct PP { int x; int y; int step; }te, nt; int n; int a[N][N]; int dirx[] = { 1,0,-1,0 };//方向 int diry[] = { 0,1,0,-1 }; int vis[N][N]; int inx[N], iny[N]; int mi = INT_MAX; int check(int x, int y) //保證不越界、不二次進入 { if (x < 1 || x > 1000 || y < 1 || y > 1000 || vis[x][y] == 1) return 0; else return 1; } void bfs() { te.x = 1; te.y = 1; te.step = 0; vis[te.x][te.y] = 1; queue<PP> q; q.push(te); while (q.size() >= 1) { te = q.front(); q.pop(); if (a[te.x][te.y] == -1) { mi = te.step; return; } nt.step = te.step + 1; for (int i = 0; i < 4; i++) { nt.x = te.x + dirx[i]; nt.y = te.y + diry[i]; if (check(nt.x, nt.y) == 1) { vis[nt.x][nt.y] = 1; q.push(nt); } } } } int main() { //freopen("in.txt","r",stdin); while (scanf("%d", &n) != EOF) { int i; memset(a, 0, sizeof(a)); for (i = 0; i < n; i++) { scanf("%d", &inx[i]); } for (i = 0; i < n; i++) { scanf("%d", &iny[i]); a[inx[i]][iny[i]] = -1; } bfs(); printf("%d\n", mi); } }
2 “迴文串”正讀反讀均一樣的字串,“level”"noon";花花有兩個字串A B,現他想將B插入A中使其變成迴文串,求有多少種插入方法,B插入位置不一樣就是不同方法
如:A="aba" B="b",有4種插入方法“baba” "abba" "abba" "abab" 答案為2
輸入描述:
輸入資料共兩行;A、B;字串<100,只包含小寫字母
#include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <queue> #include <limits.h> using namespace std; #define N 1005 string s, t, c; int szs, szt; int ans; int check(string x) { int i = 0, j = x.size() - 1; while (i <= j) { if (x[i] != x[j]) return 0; i++; j--; } return 1; } void fun(int x) { c = s.substr(0, x) + t + s.substr(x); // << x << " " << c << endl; if (check(c) == 1) { ans++; } } int main() { //freopen("in.txt","r",stdin); //while(scanf("%d",&n) != EOF ) { while (cin >> s >> t) { szs = s.size(); szt = t.size(); ans = 0; int i; for (i = 0; i <= szs; i++) { fun(i); } printf("%d\n", ans); } }
3 二貨小易有一個W*H的網格盒子,網格的行標號0~H-1,網格列標號0~W-1,每個格子至多放一塊蛋糕,任意兩塊蛋糕的歐幾裡距離不能等於2.
(x1,y1),(x2,y2)的歐幾裡距離:(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)的算術平方根。
小易在網格內能夠放多少塊蛋糕?
輸出描述:輸出最多放的蛋糕數;
輸入例子:3 2
輸出:4
#include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <queue> #include <limits.h> using namespace std; #define N 1005 int a[N][N]; int n,m; int ans = 0; int main() { //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m) != EOF ) { //while(cin >> s >> t) { memset(a,0,sizeof(a)); int i,j,ni,nj; ans = 0; for(i = 0;i < n;i++){ for(j = 0;j < m;j++) { if(a[i][j] == -1) continue; ans++; ni = i + 2; nj = j; if(ni < n) { a[ni][nj] = -1; } ni = i; nj = j + 2; if(nj < m) { a[ni][nj] = -1; } } } printf("%d\n",ans); } }