杭电2012复试上机真题

ps:题是别的地方copy过来的,代码是自己的

第一题:

输入一个十进制的数,把它转成十六进制。 

//leetcode 168 171:26进制转换成10进制
//这里我输入int输出char
#include<stdio.h>
/*
	二进制	十六进制 
	0       0
	16      10
	256     100
*/
int main(){
	int com;
	char result[10];
	char x[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
	while(scanf("%d",&com) != EOF){
		getchar();
		int nums = 1;//计算转换后的16进制有几位长,最短也有一位 
		
		int tmp = com;
		while(tmp/16 != 0){
			nums++; 
			tmp /= 16; 
		}
		
		result[nums] = '\0'; //char数组末尾
		while(nums){			
			result[--nums] = x[com%16]; //先除余再整除
			com /= 16;
		}
		
		char* p;
		p = result;
		while(*p != '\0'){
			printf("%c",*p);
			p++;
		}
		printf("\n");
	}	
	return 1;
}
/*如果想判断转换是否正确,使用
int main(){
	int num;
	scanf("%d",&num);
	printf("%x",num); 	
	return 1;
} 
*/

第二题:

贪吃蛇,给你一个50X50的表格,贪吃蛇初始化在某个位置,自身长度20格,头往四个方向移动,每次移动一格,判断是成功、出界还是撞到自己,具体的题目是用英文描述的,大概意思就是这样。输入第一行为移动的步数,第二行为这些步数的方向,输出判断。

地图左上角坐标(1,1),右下角坐标(50,50),蛇头起始在(25,30),蛇尾在(25,11),四个方向为N,W,E,S,第一行移动的步数输入0程序结束。

#include <stdio.h>
 
struct snake{
	int x;
	int y;
}; 
 
int main(){
	struct snake s[20];	
	int steps;
	scanf("%d",&steps);

	while(steps != 0){
		for(int i = 0;i < 20;i++){ //初始化蛇的位置 
			s[i].y = 25;
			s[i].x = 30 - i; 
	    }	
				
		char step[100];
		scanf("%s",step);
		char* p = step;
		
		int j; 
		for(j = 0;j < steps;j++){
			int newx = 0,newy = 0; 
			switch(*p){ // 主循环 先判断蛇头移动的下一点 
				case 'N': newy--; break;
				case 'S': newy++; break;
				case 'E': newx++; break;
				case 'W': newx--; break;
			}
			
			if(s[0].x + newx == 0 || s[0].x + newx == 51 || s[0].y + newy == 0 || s[0].y + newy == 51){
				printf("The worm ran off the board on move %d\n",j + 1);
				break;
			} 
			
			int cflag = 0;
			for (int n = 0;n < 19;n++){  // 这里有个特例,当头部当回合移动到尾部的位置时,是不算撞到自己的 ,而尾部移动的位置在上一回合肯定是尾部前一节所在位置,不可能是凭空移动的,所以判断时不比较s[19] 			
				    //形象一点说就是蛇咬自己尾巴,却永远咬不到
                    if (s[0].x + newx == s[n].x && s[0].y + newy == s[n].y){
					printf("The worm ran into itself on move %d\n",j + 1); 
					cflag = 1;
					break;
				}
			}
			if(cflag){
				break;
			}
						
			for(int m = 19;m >= 1;m--){ //进行移动,除蛇头外,n节身体移动到n-1节身体的位置 
				s[m].x = s[m - 1].x;
				s[m].y = s[m - 1].y;
			}
			s[0].x += newx; 
			s[0].y += newy;
			
			p++;
		}
				
		if(j == steps){
			printf("The worm successfully made all %d moves\n",steps);
		}
		scanf("%d",&steps);
	}
	return 1;
}

sample输出结果:

猜你喜欢

转载自blog.csdn.net/jh8w8m/article/details/87440917