路径之谜
小明冒充X星球的骑士,进入了一个奇怪的城堡。
城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n x n 个方格。【如图1.png】所示。
按习俗,骑士要从西北角走到东南角。
可以横向或纵向移动,但不能斜着走,也不能跳跃。
每走到一个新方格,就要向正北方和正西方各射一箭。
(城堡的西墙和北墙内各有 n 个靶子)
同一个方格只允许经过一次。但不必做完所有的方格。
如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?
有时是可以的,比如图1.png中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
输入:
第一行一个整数N(0<N<20),表示地面有 N x N 个方格
第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)
输出:
一行若干个整数,表示骑士路径。
为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....
比如,图1.png中的方块编号为:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
示例:
用户输入:
4
2 4 3 4
4 3 3 3
程序应该输出:
0 4 5 1 2 3 7 11 10 9 13 14 15
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
1 #include <bits/stdc++.h> 2 3 /** 4 @author:d g w 5 */ 6 using namespace std; 7 typedef long long LL ; 8 9 const int maxn=1e3; 10 11 int map1[maxn][maxn]; 12 bool inq[maxn][maxn]={0}; 13 int X[4]={0,0,-1,1}; 14 int Y[4]={1,-1,0,0}; 15 int n; 16 int bei[4],xi[4];//记录边界数 17 int beisum=0,xisum=0; 18 int res[maxn]={0},alen=0; 19 20 void dfs(int x,int y){ 21 if(x==n-1&&y==n-1){ 22 if(beisum==0&&xisum==0){ 23 for(int i=0;i<alen;i++){ 24 cout<<res[i]<<" "; 25 } 26 } 27 } 28 for(int i=0;i<4;i++){ 29 int newx=x+X[i]; 30 int newy=y+Y[i]; 31 if(newx>=0&&newx<n&&newy>=0&&newy<n&&inq[newx][newy]==0&&bei[newy]>0&&xi[newx]>0){ 32 inq[newx][newy]=1; 33 beisum--; 34 xisum--; 35 bei[newy]--; 36 xi[newx]--; 37 res[alen]=map1[newx][newy]; 38 alen++; 39 dfs(newx,newy); 40 alen--; 41 inq[newx][newy]=0; 42 beisum++; 43 xisum++; 44 bei[newy]++; 45 xi[newx]++; 46 } 47 } 48 49 50 } 51 52 int main() 53 { 54 int k=0; 55 for(int i=0;i<4;i++){ 56 for(int j=0;j<4;j++){ 57 map1[i][j]=k++; 58 } 59 } 60 cin>>n; 61 for(int i=0;i<n;i++){ 62 cin>>bei[i]; 63 beisum+=bei[i]; 64 } 65 for(int i=0;i<n;i++){ 66 cin>>xi[i]; 67 xisum+=xi[i]; 68 } 69 inq[0][0]=1; 70 beisum--; 71 xisum--; 72 bei[0]--; 73 xi[0]--; 74 res[alen]=map1[0][0]; 75 dfs(0,0); 76 system("pause"); 77 return 0; 78 }
平方末尾
能够表示为某个整数的平方的数字称为“平方数”
比如,25,64
虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。
因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。
所以,4325435332必然不是平方数。
如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗?
请计算一下,一个2位以上的平方数的最后两位有多少种可能性?
注意:需要提交的是一个整数,表示2位以上的平方数最后两位的不同情况数。
不要填写任何多余内容(比如,说明解释文字等)
1 #include <bits/stdc++.h> 2 3 /** 4 @author:d g w 5 */ 6 using namespace std; 7 typedef long long LL ; 8 9 const int maxn=1e5; 10 set<string> st; 11 int main() 12 { 13 int ans=0; 14 stringstream ss; 15 //[0, 1, 4, 5, 6, 9] 16 for(int i=10;i<100;i++){ 17 int a=i*i; 18 ss<<a; 19 string s; 20 ss>>s; 21 ss.clear(); 22 int len=s.length(); 23 string p=s.substr(len-2,len); 24 st.insert(p); 25 } 26 cout<<st.size(); 27 system("pause"); 28 return 0; 29 }
反幻方
我国古籍很早就记载着
2 9 4
7 5 3
6 1 8
这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。
下面考虑一个相反的问题。
可不可以用 1~9 的数字填入九宫格。
使得:每行每列每个对角线上的数字和都互不相等呢?
这应该能做到。
比如:
9 1 2
8 4 3
7 5 6
你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。
旋转或镜像算同一种。
比如:
9 1 2
8 4 3
7 5 6
7 8 9
5 4 1
6 3 2
2 1 9
3 4 8
6 5 7
旋转或镜像算同一种等都算作同一种情况。
请提交三阶反幻方一共多少种。这是一个整数,不要填写任何多余内容。
1 #include <bits/stdc++.h> 2 3 /** 4 @author:d g w 5 */ 6 using namespace std; 7 typedef long long LL ; 8 9 const int maxn=1e3; 10 11 12 int m[10]; 13 int main() 14 { 15 16 int a[9]={1,2,3,4,5,6,7,8,9},ans=0; 17 do{ 18 bool flag=true; 19 m[0]=a[0]+a[1]+a[2]; 20 m[1]=a[3]+a[4]+a[5]; 21 m[2]=a[6]+a[7]+a[8]; 22 m[3]=a[0]+a[4]+a[8]; 23 m[4]=a[2]+a[4]+a[6]; 24 m[5]=a[0]+a[3]+a[6]; 25 m[6]=a[1]+a[4]+a[7]; 26 m[7]=a[2]+a[5]+a[8]; 27 28 for(int i=0;i<8;i++){ 29 for(int j=i+1;j<8;j++){ 30 if(m[i]==m[j]){ 31 flag=false; 32 break; 33 } 34 } 35 if(!flag){ 36 break; 37 } 38 } 39 if(flag){ 40 ans++; 41 } 42 }while(next_permutation(a,a+9)); 43 cout<<ans/8; //旋转有四种 镜像两种 所以 4*2 44 system("pause"); 45 return 0; 46 } 47 48 /* 49 5 50 5 51 8 3 52 12 7 16 53 4 10 11 6 54 9 5 3 9 4 55 */
赢球票
某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。
主持人拿出 N 张卡片(上面写着 1~N 的数字),打乱顺序,排成一个圆圈。
你可以从任意一张卡片开始顺时针数数: 1,2,3.....
如果数到的数字刚好和卡片上的数字相同,则把该卡片收入囊中,从下一个卡片重新数数。
直到再无法收获任何卡片,游戏结束。囊中卡片数字的和就是赢得球票的张数。
比如:
卡片排列是:1 2 3
我们从1号卡开始数,就把1号卡拿走。再从2号卡开始,但数的数字无法与卡片对上,
很快数字越来越大,不可能再拿走卡片了。因此这次我们只赢得了1张球票。
还不算太坏!如果我们开始就傻傻地从2或3号卡片数起,那就一张卡片都拿不到了。
如果运气好,卡片排列是 2 1 3
那我们可以顺利拿到所有的卡片!
本题的目标就是:已知顺时针卡片序列。
随便你从哪里开始数,求最多能赢多少张球票(就是收入囊中的卡片数字之和)
输入数据:
第一行一个整数N(N<100),表示卡片数目
第二行 N 个整数,表示顺时针排列的卡片
输出数据:
一行,一个整数,表示最好情况下能赢得多少张球票
比如:
用户输入:
3
1 2 3
程序应该输出:
1
比如:
用户输入:
3
2 1 3
程序应该输出:
6
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
answer:重点在于循环模拟进退位,还要注意打表后环位
1 #include <bits/stdc++.h> 2 3 /** 4 @author:d g w 5 */ 6 using namespace std; 7 typedef long long LL ; 8 9 const int maxn=1e3; 10 11 int m[maxn],pnum=0; 12 int inq[maxn]; 13 int n; 14 15 int f() 16 { int ans=0; 17 18 for(int i=0; i<n; i++) 19 { 20 for(int i=0; i<n; i++) 21 { 22 inq[i]=m[i]; 23 } 24 int re=0; 25 int cnt=1; 26 int start=i; 27 while(1) 28 { 29 bool flag=true; 30 for(int j=0; j<n; j++) 31 { 32 if(inq[j]>=cnt) 33 { 34 flag=false; 35 break; 36 } 37 } 38 if(flag) 39 break; 40 int k=start%n; 41 if(inq[k]==cnt) 42 { 43 inq[k]=-1; 44 re+=cnt; 45 cnt=1; 46 } 47 else if(inq[k]!=-1) 48 { 49 cnt++; 50 } 51 start++; 52 } 53 54 ans=max(ans,re); 55 } 56 return ans; 57 } 58 59 int main() 60 { 61 cin>>n; 62 for(int i=0; i<n; i++) 63 { 64 cin>>m[i]; 65 } 66 67 cout<< f(); 68 system("pause"); 69 return 0; 70 } 71 72 /* 73 5 74 5 75 8 3 76 12 7 16 77 4 10 11 6 78 9 5 3 9 4 79 */
打印数字
小明写了一个有趣的程序,给定一串数字。
它可以输出这串数字拼出放大的自己的样子。
比如“2016”会输出为:
22222 00000 1 6666
2 2 0 0 1 1 6
2 0 0 1 666666
2 0 0 1 6 6
2 0 0 1 6 6
2 2 0 0 1 6 6
2222222 00000 1111 66666
请仔细分析代码,填写划线部分缺少的内容。
#include <stdio.h> #include <string.h> #define ZIW 8 #define ZIH 7 void f(int n) { char cc[100]; int i,j; char di[][ZIH][ZIW] = {{" 00000 ", "0 0", "0 0", "0 0", "0 0", "0 0", " 00000 "}, {" 1 ", " 1 1 ", " 1 ", " 1 ", " 1 ", " 1 ", " 1111"}, {" 22222 ", "2 2", " 2", " 2 ", " 2 ", " 2 2", "2222222"}, {" 33333 ", "3 3", " 3", " 3333 ", " 3", "3 3", " 33333 "}, {" 44 ", " 4 4 ", " 4 4 ", "4 4 ", "4 4 ", "4444444", " 4 "}, {" 55555 ", " 5 ", "555555 ", " 5", " 5", "5 5", " 55555 "}, {" 6666 ", "6 ", "666666 ", "6 6", "6 6", "6 6", " 66666 "}, {"7777777", "7 7 ", " 7 ", " 7 ", " 7 ", " 7 ", " 7 "}, {" 88888 ", "8 8", "8 8", " 88888 ", "8 8", "8 8", " 88888 "}, {" 99999 ", "9 9", "9 9", " 999999", " 9", "9 9", " 99999 "}}; sprintf(cc, "%d", n); for(i=0; i<ZIH; i++){ for(j=0; j<strlen(cc); j++){ printf("%s ", _______________________ ); //填空位置 } printf("\n"); } } int main() { f(2016); return 0; }
注意:只提交划线部分缺少的代码,不要添加任何题面已有代码或符号。
也不要提交任何说明解释文字等。
1 #include <stdio.h> 2 #include <string.h> 3 #define ZIW 8 4 #define ZIH 7 5 void f(int n) 6 { 7 char cc[100]; 8 int i,j; 9 char di[][ZIH][ZIW] = 10 { 11 {" 00000 ", 12 "0 0", 13 "0 0", 14 "0 0", 15 "0 0", 16 "0 0", 17 " 00000 "}, 18 {" 1 ", 19 " 1 1 ", 20 " 1 ", 21 " 1 ", 22 " 1 ", 23 " 1 ", 24 " 1111"}, 25 {" 22222 ", 26 "2 2", 27 " 2", 28 " 2 ", 29 " 2 ", 30 " 2 2", 31 "2222222"}, 32 {" 33333 ", 33 "3 3", 34 " 3", 35 " 3333 ", 36 " 3", 37 "3 3", 38 " 33333 "}, 39 {" 44 ", 40 " 4 4 ", 41 " 4 4 ", 42 "4 4 ", 43 "4 4 ", 44 "4444444", 45 " 4 "}, 46 {" 55555 ", 47 " 5 ", 48 "555555 ", 49 " 5", 50 " 5", 51 "5 5", 52 " 55555 "}, 53 {" 6666 ", 54 "6 ", 55 "666666 ", 56 "6 6", 57 "6 6", 58 "6 6", 59 " 66666 "}, 60 {"7777777", 61 "7 7 ", 62 " 7 ", 63 " 7 ", 64 " 7 ", 65 " 7 ", 66 " 7 "}, 67 {" 88888 ", 68 "8 8", 69 "8 8", 70 " 88888 ", 71 "8 8", 72 "8 8", 73 " 88888 "}, 74 {" 99999 ", 75 "9 9", 76 "9 9", 77 " 999999", 78 " 9", 79 "9 9", 80 " 99999 "}}; 81 82 sprintf(cc, "%d", n); 83 //printf("%s ", cc[0] ); 84 85 for(i=0; i<ZIH; i++){ 86 for(j=0; j<strlen(cc); j++){ 87 printf("%s ", di[cc[j]-'0'][i] ); //填空位置 88 } 89 printf("\n"); 90 } 91 } 92 93 int main() 94 { 95 f(2016); 96 return 0; 97 }