1. 程式人生 > >網易筆試 程式設計

網易筆試 程式設計

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);
	}
}


 “迴文串”正讀反讀均一樣的字串,“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);
    }
}