1.   营救

铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。

通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。

为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。

【输入格式】

第一行为n(0<n<=100),下面是一个n*n的0、1矩阵,表示海洋地图;最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。

【输出格式】

哥伦比亚号到铁塔尼号的最短距离。

【样例输入】

3

0 0 1

1 0 1

1 0 0

1 1 3 3

【样例输出】

4

#include <iostream>

using namespace std;
struct node{
int x;
int y;
int step;
};
struct node que[];
int map[][];
int book[][];
//int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int n,sx,sy,ex,ey,tx,ty,flag = ;
int head = ,tail = ;
void bfs(){
int next[][] = {{,},{,},{,-},{-,}};
que[tail].x = sx;
que[tail].y = sy;
que[tail].step = ;
tail++;
book[sx][sy] = ;
while(head < tail){
for(int i = ;i < ;i++){
tx = que[head].x + next[i][];
ty = que[head].y + next[i][];
if(tx < || tx > n || ty < || ty > n){
continue;
}
if(map[tx][ty] == && book[tx][ty] == ){
book[tx][ty] = ;
que[tail].x = tx;
que[tail].y = ty;
que[tail].step = que[head].step + ;
tail++;
}
if(tx == ex && ty == ey){
flag = ;
break;
}
}
if(flag == ){
break;
}
head++;
}
}
int main(){
cin >> n;
for(int i = ;i <= n;i++){
for(int j = ;j <= n;j++){
cin >> map[i][j];
}
}
cin >> sx >> sy >> ex >> ey;
bfs();
cout << que[tail-].step << endl;
return ;
}

2、抓住那头牛

农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:

1、从X移动到X-1或者X+1,每次移动花费一分钟

2、从X移动到2*X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花费多少时间才能抓住牛?

【输入格式】

两个整数,N和K

【输出样例】

一个整数,农夫抓到牛所要花费的最小分钟数

【样例输入】

5 17

【样例输出】

4

#include <iostream>

using namespace std;
int n,k,x;
bool v[];
int h[][];
int main(){
cin >> n >> k;
h[][] = n,v[n] = ;
int head = ,tail = ;
do{
head++;
for(int i = ;i <= ;i++){
x = h[head][];
if(i == )
x++;
if(i == )
x--;
if(i == )
x *= ;
if(x >= && x <= )
if(!v[x] || h[x][] > h[h[head][]][]+ ){
tail++;
h[tail][] = x;
v[x] = ;
h[x][] = h[h[head][]][]+;
}
}
}while(head < tail);
cout << h[k][] << endl;
return ;
}

1、Knight Moves

输入L,代表有L*L的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

【输入格式】

首先输入一个n(0<n<=50),表示测试样例的个数。每个测试样例有三行。第一行是棋盘的大小L(4<=L<=100)。第二行和第三行分别表示马的起始位置和目标位置(0~L-1)。

【输出格式】

马移动的最小步数,起始位置和目标位置相同时输出0。

【样例输入】

3

8

0 0

7 0

100

0 0

30 50

10

1 1

1 1

【样例输出】

5

28

0

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring> using namespace std;
int fx[] = {,,,,-,-,-,-};
int fy[] = {,-,,-,,-,,-};
int N,n,sx,sy,ex,ey,h[][];
int res[];
bool visited[][];
int work(int sx,int sy,int ex,int ey){
if((sx == ex) && (sy == ey))
return ;
memset(visited,,sizeof(visited));
// for(int i = 0;i < 1000;i++){
// for(int j = 0;j < 1000;j++){
// visited[i][j] = 0;
// }
// }
int t = ,w = ;
h[][] = sx,h[][] = sy,h[][] = ;
do{
t++;
int x = h[t][],y = h[t][];
for(int i = ;i < ;i++){
int X = x + fx[i],Y = y + fy[i];
if(X >= && X < n && Y >= && Y < n && !visited[X][Y]){
w++;
h[w][] = X;
h[w][] = Y;
h[w][] = h[t][] + ;
visited[X][Y] = ;
if(X == ex && Y == ey)
return h[w][];
}
}
}while(t < w);
}
int main(){
cin >> N;
for(int i = ;i <= N;i++){
cin >> n >> sx >> sy >> ex >> ey;
res[i] = work(sx,sy,ex,ey);
}
for(int j = ;j <= N;j++){
cout <<res[j] << endl;
}
return ;
}

2. Lake Counting

有一块N*M(1<=N,M<=100)的土地,雨后积起了水,有水标记为‘$’,干燥为‘#’。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?(八连通区域指的是从区域内每一位置出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这八个方向的移动的组合,在不越出区域的前提下,到达区域内的任意位置。)

【样例输入】

10 12

$########$$#

#$$$#####$$$

####$$###$$#

#########$$#

#########$##

##$######$##

#$#$#####$$#

$#$#$####$$#

#$#$######$#

##$#######$#

【样例输出】

3

#include <iostream>
using namespace std;
struct node {
int x;
int y;
};
char map[][];
struct node que[];
int head,tail;
int book[][];
int sum;
int next[][] = {{,},{,},{,-},{-,},{-,},{,},{,-},{-,-}};//右下左上
int m,n,x,y,tx,ty; void bfs(int x,int y) {
sum++;
map[x][y] = ;
//初始化队列
head = ;
tail = ;
que[tail].x = x;
que[tail].y = y;
book[x][y] = ;
tail++;
while(head < tail) {
for(int k = ; k < ; k++) {
tx = que[head].x + next[k][];
ty = que[head].y + next[k][];
if(tx < || tx >= m || ty < || ty >= n) {
continue;
}
if(map[tx][ty] == '$' && book[tx][ty] == ) {
map[tx][ty] = '#';
book[tx][ty] = ;
que[tail].x = tx;
que[tail].y = ty;
tail++;
}
}
head++;
}
}
int main() {
cin >> m>>n;
for(int i = ; i <m; i++) {
for(int j = ; j < n; j++) {
cin >> map[i][j];
}
}
for(int i = ; i <m; i++) {
for(int j = ; j < n; j++) {
if(map[i][j] == '$') {
bfs(i,j);
}
}
}
cout <<sum << endl;
return ;
}

3、迷宫问题

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

【输入格式】

一个5 * 5的二维数组,表示一个迷宫。数据保证有唯一解。

【输出格式】

左上角到右下角的最短路径,格式如样例所示。

【样例输入】

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

【样例输出】

(0,0)

(1,0)

(2,0)

(2,1)

(2,2)

(2,3)

(2 , 4)

(3 , 4)

(4,4)

#include <iostream>

using namespace std;
int h[][],b[];
int xx[] = {-,,,},yy[] = {,,-,};
bool a[][];
int main(){
int t = ,w = ,x,y,k = ;
for(int i = ;i < ;i++){
for(int j = ;j < ;j++){
cin >> a[i][j];
}
}
h[][] = ;
h[][] = ;
a[][] = ;
do{
t++;
for(int i =;i < ;i++){
x = h[t][] + xx[i];
y = h[t][] + yy[i];
if(x >= && x < && y >= && y < && a[x][y] == ){
a[x][y] = ;
w++;
h[w][] = t;
h[w][] = x;
h[w][] = y;
if(x == && y == )
break;
}
} }while(t < w);
while(w > ){
k++;
b[k] = w;
w = h[w][];
}
cout << "(0,0)" << endl;
for(int i = k;i >= ;i--)
cout << "(" << h[b[i]][] << "," << h[b[i]][] << ")" << endl;
return ;
}

noip第23课作业的更多相关文章

  1. noip第5课作业

    1.     计算税收 [问题描述] 对某产品征收税金,在产值1万元以上收税5%:在1万元以下但在5000元或者以上的征收税3%:在5000元以下但在1000元或以上征收税2%:1000元以下的免收税 ...

  2. noip第2课作业

    1.    大象喝水 [问题描述] 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数).问大象至少要喝多少桶水才会解渴. 输入:输入有一行,包行两 ...

  3. noip第23课资料

  4. noip第34课作业

    1.    信息加密 [问题描述] 在传递信息的过程中,为了加密,有时需要按一定规则将文本转换成密文发送出去.有一种加密规则是这样的:1. 对于字母字符,将其转换成其后的第3个字母.例如:A→D,a→ ...

  5. noip第33课作业

    1.    排座椅 [问题描述] 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同 ...

  6. noip第29课作业

    1.   钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...

  7. noip第28课作业

    分段数列 [问题描述] 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入格式: 输入第1行包含两个正整 ...

  8. noip第27课作业

    1. 繁忙的都市 [问题描述] 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个 ...

  9. noip第26课作业

    1.    信使 [问题描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指 ...

随机推荐

  1. React-router4 第三篇 BasicURL ParametersRedirects (Auth) 谷歌翻译:重定向

    依旧是地址 https://reacttraining.com/react-router/web/example/auth-workflow 上来一步走 先导入模块 import React, { P ...

  2. spingmvc项目根路径访问不到

    问题: 如何改mvc中项目的欢迎页,或者叫做根路径 一个东西快弄完了,就剩下一个问题,应该是个小问题.就是mvc项目的欢迎页,怎么给改下呢 访问根路径http://localhost/demo 怎么都 ...

  3. 1C - A + B Problem II

    I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum o ...

  4. java有车有房有能力最基本运用

    public class yunsuan { public static void main(String[] args) { // 1是有,0是没有 int i = 1, l = 0;// 有房 i ...

  5. snort帮助文档

    [1] CentOS6.6下基于snort+barnyard2+base的入侵检测系统的搭建 2 基于Snort的C_S模式的IDS的设计与应用_王会霞.caj [3] Snort 笔记1 - 3种模 ...

  6. WebDriverException:Message:'geckodriver'executable needs to be in Path

    geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe,下载地址:https:// ...

  7. MySQL学习笔记-cache 与 buffer

    Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而 buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写 ...

  8. springboot server.address 配置问题

    1. server.address 为对应机器ip地址时 ,如 18.10.x.x 此时访问该服务只能使用 ip 访问 . 2. 配置为 127.0.0.1 时  可以使用 localhost  和  ...

  9. flask在其他文件中添加路由

    应用文件为:app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): re ...

  10. response设置编码格式

    response设置编码的三种方式 在java后台的Action代码或者Servlet代码中用response的方法来设置输出内容的编码方式,有以下三个方法: 1.response.setCharac ...