一只兔子藏身于20个圆形排列的洞中(洞从1开始编号),一只狼从x号洞开始找,下次隔一个洞找(即在x+2号洞找),在下次个两个洞找(即在x+5号洞找),它找了n次仍然没有找到。问兔子可能在那些洞中。
输入有多组数据,每组数据一行两个整数分别为x和n(x <= 20,n <= 100000)
每组数据一行按从小到大的顺序输出兔子可能在的洞,数字之间用空格隔开。若每个洞都不肯能藏着兔子,输出-1。
while True:
try:
x, n = map(int, input().split())
arr = [True] * 20
for i in range(2, n + 2):
arr[x - 1] = False
x = (x + i) % 20
res = [str(i + 1) for i, v in enumerate(arr) if v == True]
print(" ".join(res)+" " if res else -1)
except:
break
#include<iostream> using namespace std; int main(){ int x,n; while(cin>>x>>n){ int a[21]={0},j=2; for(int i=0;i<n;++i){ if(x%20==0)a[20]=1; a[x%20]=1; x+=j; j++; } int f=0; for(int i=1;i<21;++i){ if(a[i]==0){ f=1; cout<<i<<" "; } } if(f==0)cout<<-1; cout<<endl; } }
真是狡兔三窟啊,输出咋多了一段尾巴,原来在每组数据结束的时候加上换行符! import java.util.*; public class Main{ public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNext()) { int[] home=new int[20]; for(int i=0;i<20;i++) { home[i]=1; } int x=scan.nextInt(); int n=scan.nextInt(); int index=x-1; for(int i=1;i<=n;i++) { if(index>19) { index=index%20; } home[index]=0; index=index+i+1; } boolean flage=false; for(int i=0;i<20;i++) { if(home[i]==1) { System.out.print(i+1+" "); flage=true; } } if(flage==false) { System.out.println(-1); } System.out.println(); } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int x=sc.nextInt(); int n=sc.nextInt(); boolean[] hide=new boolean[21]; for(int i=1;i<=20;i++) hide[i]=true; hide[x]=false; for(int i=0;i<n;i++){ int index=nextHole(i); index=(x+index)%20; if(index==0) index=20; hide[index]=false; } ArrayList<Integer> list=new ArrayList<Integer>(); for(int i=1;i<=20;i++){ if(hide[i]) list.add(i); } if(list.size()>0){ for(int i=0;i<list.size()-1;i++) System.out.print(list.get(i)+" "); System.out.println(list.get(list.size()-1)+" "); }else{ System.out.println("-1"+" "); } } } public static int nextHole(int n){ int sum=0; for(int i=2;i<=n+2;i++){ sum+=i; } return sum; } }
package com.special.first;
import java.util.Scanner;
/**
* CVTE01-兔子藏洞
*
* 又是哈希思想哦
* 我们用一个数组来表示20的洞
* 然后对于狼访问过得洞设置一个值,数组索引为洞的编号减一
* 之所以我们处理洞的编号从0开始到19
* 是为了循环处理方便,因为是个圆形排列,超过数组大小时势必要从头开始
* 引入从0开始,我们可以直接把当前的索引与洞的数量取余即可得到当前合法的洞号
*
* 另一个变量count则记录着下一次需要走的间隔
* Create by Special on 2018/3/4 14:14
*/
public class Pro037 {
static final int SIZE = 20;
public static void findRabbit(boolean[] map, int x, int n){
int index = x - 1, count = 2;
for(int i = 1; i <= n; i++){
map[index] = true;
index += count;
if(index >= SIZE){
index %= SIZE;
}
count++;
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()){
int x = input.nextInt();
int n = input.nextInt();
boolean[] map = new boolean[SIZE];
findRabbit(map, x, n);
boolean flag = false;
for(int i = 0; i < SIZE; i++){
if(!map[i]) {
System.out.print((i + 1) + " ");
flag = true;
}
}
System.out.println(!flag ? "-1" : "");
}
}
}
使用类似于钟表的时、分、秒换算方法,20个兔子洞形成一个环,在超出20的时候会重新从1开始计算,这时就只需计算该数与20的模即可。
另外就是依次隔一个、隔两个、隔三个的实现,纸上画出来就很容易找到规律,模拟出来即可。
调试过程中出错地方在于提示vector越界,经检查发现是两个for循环的上界错写为n,实际上应该是兔子洞圈的标号上界。
#include "stdafx.h"
#include
#include
using namespace std;
int x, n;
int main() {
while (cin >> x >> n) {
vectorbook(21);
vectorans;
int flag = 0;
for (int i = 1; i <= n; i++) {
if (x%20==0) book[20]=1;
book[x%20] = 1;
x = x + i + 1;
}
int bookedNum = 0;
for (int i = 1; i <= 20; i++) {
if (book[i] == 0) {
ans.push_back(i);
}
else {
bookedNum++;
}
}
if (bookedNum == 20) {
flag = 1;
cout << -1 << endl;
break;
}
else if (flag == 0) {
for (int i = 0; i<ans.size(); i++) {
cout << ans[i] << " ";
}
cout << endl;
}
ans.clear();
}
return 0;
}
#include<iostream> #include<vector> using namespace std; const int Size=20; int main() { //vector<bool> hole(Size); int x,n; while(cin>>x>>n) { vector<bool> hole(Size); int index=x-1; for(int i=1;i<=n;i++) { if(index>19) index=index%20; hole[index]=1; index=index+i+1; } int count=0; for(int i=0;i<20;i++) { if(!hole[i]) { count++; cout<<i+1<<" "; } } if(count) cout<<endl; else cout<<-1<<endl; } return 0; }
这- -绝对是最运算速度最快的AC代码- - 哈哈哈哈,还有谁 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = null; while((s = br.readLine()) != null){ String ch[]=s.split(" "); int x=Integer.parseInt(ch[0]); int n=Integer.parseInt(ch[1]); boolean sb[]=new boolean[20]; int start=x+1; int diaoni[]=new int[8]; for(int i=0;i<8;i++){ if(start>20) start=start-20; diaoni[i]=start; if(i%2==0) start=start+2; else start=start+3; } Arrays.sort(diaoni); for(int i=0;i<8;i++){ System.out.print(diaoni[i]+" "); } System.out.println(); }
//pass~ #include <stdio.h> #include <stdlib.h> struct node { int num; struct node* next; }; typedef struct node Node; typedef Node* Link; void createLink(Link *head) { *head = NULL; } void tailInsert(Link *head,Link *newNode) { if(NULL == *head) { (*newNode)->next = *head; *head = *newNode; } else { Link temp = *head; while(temp->next != NULL) { temp = temp->next; } temp->next = *newNode; (*newNode)->next = NULL; } } Link findHole(Link head,int begin) { Link temp = head; while(temp->num != begin) { temp = temp->next; } return temp; } void printResult(Link head) { int i; Link temp = head; for(i = 0; i < 20; i++) { if(temp->num != 0) { printf("%d ",temp->num); } temp = temp->next; } printf("\n"); } int procress(Link head,int begin,int times) { int i; int j = 1; Link temp = findHole(head,begin); while(times>0) { temp->num = 0; for(i = 0; i <= j; i++) { temp = temp->next; } j++; times--; } printResult(head); return 0; } int main() { int i; int begin; int times; Link head; Link newNode; while(scanf("%d%d",&begin,×) != EOF) { createLink(&head); for(i = 1; i <= 20; i++) { newNode = (Link)malloc(sizeof(Node)); if(newNode == NULL) { printf("malloc error!\n"); exit(1); } newNode->num = i; tailInsert(&head,&newNode); } newNode->next = head; procress(head,begin,times); } return 0; }
#include <stdio.h> int main(){ for(int x,n,bit=(1<<21)-2;~scanf("%d%d",&x,&n);bit=(1<<21)-2){ for(int i=2;bit&&n--;bit&=~(1<<(x==0?20:x)),x=(x+i++)%20); for(int i=1;bit && i<=20;++i){ if (bit&(1<<i)) printf("%d ",i); } printf("%s\n",bit?"":"-1"); } return 0; }
import java.util.Scanner; public class RabbitHide { public static void main(String[] args) { Scanner input=new Scanner(System.in); while (input.hasNext()) { int x=input.nextInt(); // 从x开始找 int n=input.nextInt(); if (n>100000||x>20) { // 找了n次 continue; } int[] holes=new int[20]; for (int i = 0; i < holes.length; i++) { holes[i]=0; } int i=0; while (n>0) { if (holes[(x+i)%20]==0) { holes[(x+i)%20]=1; } i++; n--; x=(x+i)%20; } int flag=0; // 不可能藏着兔子 for (int j = 1; j < holes.length; j++) { if (holes[j]==0) { flag=1; System.out.print((j)+" "); } } if (holes[0]==0) { flag=1; System.out.print("20 "); } if(flag==1){ System.out.println(); }else{ System.out.println("-1"); } } } }
import java.util.*; public class Main { public static void find(int[] circle, int x, int n) { int step = 0; int current = x; while (n-- > 0) { int index = (current + step) % circle.length; circle[index] = 1; step += 1; current = (index + 1) % circle.length; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int x = scanner.nextInt(); int n = scanner.nextInt(); int[] circle = new int[20]; find(circle, x - 1, n); boolean can = false; for (int i = 0; i < circle.length; ++i) { if (circle[i] != 1) { System.out.print(i + 1); System.out.print(" "); can = true; } } if (can) { System.out.println(); } else { System.out.println("-1"); } } scanner.close(); } }
#include <iostream> #include <vector> using namespace std; int main(void) { int x, n; while (cin >> x >> n) { vector<int> core(20, 0), res; int step = 1, find = x - 1, cont = 0; while (core[find] < 3 && cont < 20 && n--) { if (core[find] == 0) cont++; core[find]++; find = (find + ++step) % 20; } if (cont < 20) { for (int i = 1; i <= core.size(); i++) { if (core[i - 1] == 0) cout << i << " "; } } else cout << -1 << " "; cout << endl; } return 0; }