求解一程序设计题目
public class Cource{
private String cNumber;
private String cName;
private double cUnit;
public static int cTotalNum = 0;
public Cource(){
this.cName="java";
this.cNumber="123";
this.cUnit = 100;
this.cTotalNum++;
}
public String getCName() {
return cName;
}
public void setCName(String name) {
cName = name;
}
public String getCNumber() {
return cNumber;
}
public void setCNumber(String number) {
cNumber = number;
}
public double getCUnit() {
return cUnit;
}
public void setCUnit(double unit) {
cUnit = unit;
}
public void printCourceInfo(){
System.out.println("cName:"+this.getCName());
System.out.println("cNumber:"+this.getCNumber());
System.out.println("cUnit:"+this.getCUnit());
}
}
一、行棋游戏:
这是一种只有一个棋子的游戏。棋盘被分为N行,M列的方格,某个位置被标记为终点T。在任何一个位置,棋子可以向左、右、上、下四个方向移动一格,记移动距离为1。
在棋盘上有一些特殊方格——飞行器,每个飞行器有一个飞行距离d,棋子达到后可以继续在同方向再“飞”d格,且移动距离仍然为1。例如,如果棋子在位置(2,8),飞行器在位置(2,7),且飞行距离为5,那么棋子向左走一格,将直接到达位置(2,2)且移动距离为1。如果飞行点落在棋盘外,则只能停在边界上。例如,假若前个飞行器的飞行距离为10,那么棋子的最终位置是(2,1)。
而且,如果飞行后的落点仍然是飞行器,则将连续飞行到目的地,且中间点不对当前棋子产生影响,当然也不算任何移动距离。例如,如果棋子位置在(2,8),飞行器在(2,7)、(2,5),且飞行距离都是5,此时棋子向左移动一格,则(2,5)的飞行器将不产生作用,移动距离仍然为1。
你的任务就是,编程计算出棋子达到终点的最短移动距离。
输入:
输入可以有多个测试用例。每个测试用例的第一行是两个整数N、M(3<=N, M<=100),表示棋盘的行列数。随后是一个整数K,表示飞行器的个数。接着的K行每行有3个正整数x、y、d,分别表示飞行器的位置(x,y)(2 <= x <= N-1, 2 <= y <= M-1)及飞行距离d。最后的两行第一行是棋子的初始位置S,第二行是终点位置T。你可以假设数据总是合法的,S与T、飞行器位置互不相同。输入0 0时表示结束
输出:
每个测试用例输出一行,即达到终点的最短距离。如果不能达到,则输出“Impossible”。
二、最少钱币数:
(这个问题的输入我感觉特别麻烦,希望给出比较好的输入方法)
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。
你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
输入:
输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K个互不相同的钱币面值Ki(1 <= Ki <= 1000)。输入M=0时结束。
输出:
每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
样例输入:
15
6 2 5 10 20 50 100
1
1 2
0
样例输出:
2
Impossible 最佳答案第一题,典型的BFS找最短路
#include
#define MAXN 105
using namespace std;
const int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int m,n;
int map[MAXN][MAXN];
int head,tail;
int queue[MAXN*MAXN][3];
bool hash[MAXN][MAXN];
int tx,ty;
int main()
{
while (cin>>n>>m && n>0)
{
int i,j,k;
memset(map,0,sizeof(map));
cin>>k;
while (k--)
{
cin>>i>>j;
i--;
j--;
cin>>map[i][j];
}
memset(hash,true,sizeof(hash));
cin>>queue[0][0]>>queue[0][1];
queue[0][0]--;
queue[0][1]--;
queue[0][2]=0;
hash[queue[0][0]][queue[0][1]]=false;
head=0;
tail=1;
cin>>tx>>ty;
tx--;
ty--;
while (head<tail && hash[tx][ty])
{
for (k=0;k<4;k++)
{
i=queue[head][0]+dir[k][0];
j=queue[head][1]+dir[k][1];
while (i>=0 && i=0 && j0)
{
i+=map[i][j]*dir[k][0];
j+=map[i][j]*dir[k][1];
if (i=n || j=m)
{
if (i<0) i=0;
if (i>=n) i=n-1;
if (j<0) j=0;
if (j>=m) j=m-1;
break;
}
}
if (i>=0 && i=0 && j<m)
if (hash[i][j])
{
queue[tail][0]=i;
queue[tail][1]=j;
queue[tail][2]=queue[head][2]+1;
hash[i][j]=false;
if (i==tx && j==ty) cout<<queue[tail][2]<<endl;
tail++;
}
}
head++;
}
if (hash[tx][ty]) cout<<"impossible"<<endl;
}
return 0;
}
第二题是典型的DP
用f[i][j]表示用前i种币值凑出总额为j的钱所需的最少钱币个数
状态转移方程f[i][j]=min{f[i-1][j](i>0时),f[i][j-Ki]+1(j>=Ki时),无穷大};
#include
#define MAXM 2010
#definme MAXK 15
using namespace std;
int m,k;
int K[MAXK];
int f[MAXK][MAXM];
int main()
{
while (cin>>m && m>0)
{
int i,j;
cin>>k;
for (i=1;i>K[i];
memset(f,-1,sizeof(f));
f[0][0]=0;
for (i=1;i<=k;i++)
for (j=0;j<=m;j++)
{
int min;
min=-1;
if (f[i-1][j]!=-1 && (min==-1 || f[i-1][j]<min)) min=f[i-1][j];
if (j>=K[i] && f[i][j-K[i]]!=-1 && (min==-1 || f[i][j-K[i]]+1<min)) min=f[i][j-K[i]]+1;
f[i][j]=min;
}
if (f[k][m]==-1) cout<<"impossible"<<endl;
else cout<<f[k][m]<<endl;
}
return 0;
}
可能是因为LZ没有正确输入。
正确的输入方式是:
n=4
i=2
j=3
(这就是为什么我说输入恶心了……)
--------------------
个人感觉主要是输入太恶心了。
能给家点分就好了~
#include <stdio.h>
void main()
{
int i,j,n;
scanf("n=%d\n",&n);
scanf("i=%d\n",&i);
scanf("j=%d",&j);
int ii,jj;
for (jj=1;jj<=n;jj++)
printf("(%d,%d)",i,jj);
printf("\n");
for (ii=1;ii<=n;ii++)
printf("(%d,%d)",ii,j);
printf("\n");
int d = i-j;
for (ii=1;ii<=n;ii++)
if (ii-d<=n && ii-d>0)
printf("(%d,%d)",ii,ii-d);
printf("\n");
int sum = i+j;
for (ii=1;ii<=n;ii++)
if (sum-ii<=n && sum-ii>0)
printf("(%d,%d)",ii,sum-ii);
printf("\n");
}
#include <stdio.h>
int main(void)
{
int i,j,n;
int a, b, tmp;
scanf("n=%d\n",&n);
scanf("i=%d\n",&i);
scanf("j=%d",&j);
for(a=1; a<=n; a++) {
printf("(%d, %d)", a, j);
}
printf("\n");
for(a=1; a<=n; a++) {
printf("(%d, %d)", i, a);
}
printf("\n");
tmp = i > j ? j : i;
a = i - tmp + 1;
b = j - tmp + 1;
for(; a<=n && b<=n ;a++,b++) {
printf("(%d, %d)", a, b);
}
printf("\n");
if(i+j > n + 1) {
b = i + j - n;
a = n;
} else {
b = 1;
a = i + j - 1;
}
for(; a>=1 && b<=n ;a--,b++) {
printf("(%d, %d)", a, b);
}
printf("\n");
return 0;
}
一道c语言程序设计题。第一幅图是题目。第二幅图是答案。第三幅图是...
两个问题,1.a[i]<=p 这里p是指针,a[i]是数组的值,2.判断a[i]>='A'&&a[i]<='Z',错误,直接判断不等于*, 因为可能包含小写字母
...是C语言程序设计第六章 函数 方面的题目,有谁会解的请解一下吧,十 ...
从代码倒数第四行area=fun(a,b,c);看出,返回类型是area:float, 传入参数是abc:float 所以 1应该填【float】, 2应该填【float a, float b, float c】s = __3__;和 s=s*(s-a)*(s-b)*(s-c);可以看出前面应该是计算 s=(a+b+c)\/2,所以3应该填【(a+b+c)\/2】area=__4...
求大神帮我解决一下几道C语言程序设计题
include <stdio.h>unsigned long factorial(unsigned int n){if(n<=1)return n;return n*factorial(n-1);}int main(int argc, char * argv[]){int i,num[10],n=0;float sum=0;printf("输入一个正整数n(n≤10):"); scanf("%d",&i);printf("%d! = %ld\\n",i,factorial(i));...
c语言程序设计题,帮忙解决一下思考题,急!!!
1、在定义二维数组时就已经给数组分配好了地址,不需要初始化也可以显示地址 2、根据显示地址可以看出每个元素占4字节
vb程序设计的题目求解释
Private Sub Command1_Click()Dim a(1 To 10) As Integer, p(1 To 3) As Integer, k As Integerk = 5For i = 1 To 10 a(i) = i '让a(1)到a(10)分别取1到10Next iFor i = 1 To 3 p(i) = a(i * i) 'p(1)=a(1*1)=1,p(2)=a(2*2)=a(4)=4...
求VB大神解答 程序设计题!
求VB大神解答 程序设计题! 5 '---'【程序设计】'---'编写函数fun其功能是能计算如图1所示的表达式'的结果值,m由... '---'【程序设计】'---' 编写函数fun其功能是
C语言程序设计求详解求详解
include<stdio.h>#include<string.h>void Swap(char a[]){int i, j, n;char t;\/\/临时变量,用于交换n = strlen(a);\/\/得到数组a的有效长度i = 0; j = n - 1;\/\/i作为起始下标,j作为末尾坐标while (i<j)\/\/i==j\/i>j说明两边交换完了{t = a[i]; a[i] = a[j]; a[j]...
【C语言程序设计】C语言求最大公约数(详解版)!
在C语言程序设计中,要解决的问题是找到任意两个正整数的最大公约数(GCD)。这个概念基于约数的定义,即一个数的约数不会大于它本身,而几个数的最大公约数不会大于其中的任何一个数。求最大公约数的目标是找到一个既能同时整除这两个数,且是最小的这样的自然数。有两种算法设计方法:穷举法和从...
c语言程序设计新猜数游戏,刚接触c语言不太会,有没有人能帮忙解答一下...
好的,以下是一个C语言程序设计的新猜数游戏的示例代码:```c include <stdio.h> include <stdlib.h> include int main(){ int answer; \/\/ 预定的随机数 int guess; \/\/ 玩家猜测的数 int scoreA = 0, scoreB = 0, scoreC = 0; \/\/ 每位玩家的得分 int currentPlayer = 1; \/\/ ...
C++程序设计题目
面向对象程序设计C++复习题 一、单选题 1.对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( D ) A. 公有类型 B. 私有类型 C. 保护类型 D. 友元类型 2.下列关于多态性的描述,错误的是( C ) A. C++语言的多态性分为编译时的多态性和运行时的多态性 B. 编译时的...
贝往沙巴: 这是 斐波那契数列,非常重要的数列.给你提供两段代码,例1是3个变量的,例2 是两个变量的例1 Private Sub Command1_Click() a = 1: b = 1 Print 1; 1; For i = 3 To 10 c = a + b Print c; a = b b = c Next End Sub例2 Private Sub Command1_Click() a = 1: b = 1 Print a; b; For i = 3 To 10 Step 2 a = a + b b = b + a Print a; b; Next End Sub
怀柔区17229562979: 求解一道编程题 - ?
贝往沙巴: #include<stdio.h>#include<math.h> int main() { float a,b,c; printf("Input a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); float s,area; s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area=%f\n",area); return 0; }//注意头文件和输入的格式
怀柔区17229562979: 求解C语言程序设计题急1,规定一个工人工作时间160h,每小 ?
贝往沙巴: 1. #include void main() { int h, e=0; printf("Please Hours\n"); scanf("%d", &h); if(h>160) { e=h-160; h=160; } printf("%d\n", h*5+e*9); } 2. #include void main() { int x=0, p=0, n=0, z=0, i, sum_p=0, sum_n=0, sum=0; for(i=0; i0) { sum_p+=x; sum+=x; p++; } else if(x
怀柔区17229562979: 急解一道程序设计的题目?
贝往沙巴: insert into Table values{"","","","",""} delete from Table where column2="003"
怀柔区17229562979: 求解一道简单的C语言C程序C编程题 - ?
贝往沙巴: 题目没说清.1.输入仅限于小写字母还是所有字符;2 y,z输出a,b还是也按ASCII码向后推两位.#include <stdio.h>#include <string.h> int main() { char iword; char oword; while(iword = getchar()) { if(iword == '\n') break; oword = (iword - 95) % 26 + 97; printf("%c",oword); } printf("\n"); return 0; } 输入:abcdefxyz 输出:cdefghzab 此程序仅限输入小写字母.
怀柔区17229562979: 求解一道编程题?
贝往沙巴: '写得简单,没有对输入的八进制数的合理性进行判断 Private Sub Command1_Click() Dim d As Integer, o As Integer d = 0 o = InputBox("请输入一个八进制数:") Do d = ( o mod 10 ) * 8 o = ( o - d ) / 10 Loop Until o=0 MsgBox("相应的十进制数是" & d) End Sub
怀柔区17229562979: 求解一道C语言编程题 - ?
贝往沙巴: #include #define ARR_LEN 30 //数组长度 void main() { int num[ARR_LEN]; //数组 用来保存1到40之间的数 int index; //循环索引 int minNum=40; //将最小值初始化为40 int place; //位置 for(index=1;index { //如果输入的数不在范围内 则重新输...
怀柔区17229562979: c语言程序设计 题目一道,求解 - ?
贝往沙巴: 天平分左右:1:分3份,任取两份称“第一次”(结果是一定可以找到有坏球的那一份)2:天平左边放3个正常的球,右边在有问题的四个里面任取3个称“第二次”2-1:如果平衡,说明问题球是剩余的一个,可以用“第三次”判断轻还是...
怀柔区17229562979: 求解一道C语言程序设计题?
贝往沙巴: C规定: 在含“||”和“&”的式子中,在第一个符号如果为“||”(“&&”),当“||”(“&&”)的左边一旦出现1(0),后面的式子就不用再计算了;如果为0(1),则后面的式子接着计算;比如你的题++x=1(x=1),1或任何数等于1,所以“||”右边的一切都不用管啦,++y,++z简单的说都是不存在的y,z仍为以前默认的0;但如果“||”左边为0的话,答案就不同了.好好领会,希望我的答案对你有帮助!
怀柔区17229562979: 求解一道简单的编程题....?
贝往沙巴: j的定义是多余的,而且你i、j混合用了,正确的代码: #include "stdio.h" void main() { int a[5],i,sum; sum=0; for(i=0;i<5;i++) scanf("%d",&a[i]); for(i=0;i<5;i++) { if(a[i]>0) sum=sum+a[i]; } printf("%d\n",sum); }