noip第23课作业
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课作业的更多相关文章
- noip第5课作业
1. 计算税收 [问题描述] 对某产品征收税金,在产值1万元以上收税5%:在1万元以下但在5000元或者以上的征收税3%:在5000元以下但在1000元或以上征收税2%:1000元以下的免收税 ...
- noip第2课作业
1. 大象喝水 [问题描述] 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数).问大象至少要喝多少桶水才会解渴. 输入:输入有一行,包行两 ...
- noip第23课资料
- noip第34课作业
1. 信息加密 [问题描述] 在传递信息的过程中,为了加密,有时需要按一定规则将文本转换成密文发送出去.有一种加密规则是这样的:1. 对于字母字符,将其转换成其后的第3个字母.例如:A→D,a→ ...
- noip第33课作业
1. 排座椅 [问题描述] 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同 ...
- noip第29课作业
1. 钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...
- noip第28课作业
分段数列 [问题描述] 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入格式: 输入第1行包含两个正整 ...
- noip第27课作业
1. 繁忙的都市 [问题描述] 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个 ...
- noip第26课作业
1. 信使 [问题描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指 ...
随机推荐
- React-router4 第三篇 BasicURL ParametersRedirects (Auth) 谷歌翻译:重定向
依旧是地址 https://reacttraining.com/react-router/web/example/auth-workflow 上来一步走 先导入模块 import React, { P ...
- spingmvc项目根路径访问不到
问题: 如何改mvc中项目的欢迎页,或者叫做根路径 一个东西快弄完了,就剩下一个问题,应该是个小问题.就是mvc项目的欢迎页,怎么给改下呢 访问根路径http://localhost/demo 怎么都 ...
- 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 ...
- java有车有房有能力最基本运用
public class yunsuan { public static void main(String[] args) { // 1是有,0是没有 int i = 1, l = 0;// 有房 i ...
- snort帮助文档
[1] CentOS6.6下基于snort+barnyard2+base的入侵检测系统的搭建 2 基于Snort的C_S模式的IDS的设计与应用_王会霞.caj [3] Snort 笔记1 - 3种模 ...
- WebDriverException:Message:'geckodriver'executable needs to be in Path
geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe,下载地址:https:// ...
- MySQL学习笔记-cache 与 buffer
Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而 buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写 ...
- springboot server.address 配置问题
1. server.address 为对应机器ip地址时 ,如 18.10.x.x 此时访问该服务只能使用 ip 访问 . 2. 配置为 127.0.0.1 时 可以使用 localhost 和 ...
- flask在其他文件中添加路由
应用文件为:app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): re ...
- response设置编码格式
response设置编码的三种方式 在java后台的Action代码或者Servlet代码中用response的方法来设置输出内容的编码方式,有以下三个方法: 1.response.setCharac ...