OJ 输入问题



1. 最简单的输入


Description  
计算 a+b  
  
Input  
两个整数 a,b  
  
Output  
a+b的值  
  
  
Sample Input  
1 2  
  
Sample Output  
3  

C
#include <stdio.h>  
int main()  
{  
    int a,b;  
    scanf("%d %d",&a, &b);  
    printf("%d\n",a+b);  //对其他题目,换成要求的复杂处理与输出  
    return 0;  
}  

C++:
#include <iostream>  
using namespace std;  
int  main()  
{  
    int a,b;  
    cin >> a >> b;  
    cout << a+b << endl;   //对其他题目,换成要求的复杂处理与输出  
    return 0;  
}  




2. 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止


Description  
计算 a + b  
  
Input  
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行   
  
Output  
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行  
  
Sample Input  
1 5  
10 20  
400 516  
  
Sample Output  
6  
30  
916  


C:
#include <stdio.h>  
int main()   
{  
    int a,b;  
    while(scanf("%d %d",&a, &b) != EOF) // 输入结束时,scanf函数返回值为EOF(-1),即没有数据输入时会退出while循环  
    {  
        printf("%d\n",a+b);  
    }  
    return 0;   
}  


  说明:scanf函数返回值就是读出的变量个数,如果一个都没有,则返回值是-1。EOF是一个预定义的常量,等于-1。 


C++:
#include <iostream>   
using namespace std;  
int main()  
{  
    int a,b;  
    while(cin >> a >> b)  
    {  
        cout << a+b << endl;  
    }  
    return 0;  
}   


  说明:当读到输入结束时,cin >> a >> b返回 0,循环也结束


3. 一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据)


Description  
计算 a + b  
  
Input  
第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行   
  
Output  
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行  
  
Sample Input  
2  
1 5  
10 20  
  
Sample Output  
6  
30  



C:
#include<stdio.h>  
int main()  
{  
    int n,i;  
    int a,b;  
    scanf("%d",&n);  
    for(i=0;i<n;i++)  
    {  
        scanf("%d%d",&a,&b);  
        printf("%d\n",a+b);  
    }  
    return 0;  
}  



C++:
#include <iostream>  
using namespace std;  
int main() {  
    int a, b, n;  
    cin >> n;  
    for(i=0;i<n;i++)  
    {  
        cin >> a >> b;  
        cout << a + b << endl;  
    }  
    return 0;  
}  






4.  输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以-1结束”,没有学生得-1分的,这个结束数据可以要得。


Description  
计算 a + b  
  
Input  
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。当输入为 0 0 时,输入结束。  
  
Output  
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。  
  
Sample Input  
1 5  
10 20  
0 0  
  
Sample Output  
6  
30  



C:
#include <stdio.h>  
int main()  
{  
    int a,b;  
    while(scanf("%d %d",&a, &b) &&(a||b))  
    {  
        printf("%d\n",a+b);  
    }  
    return 0;  
}  




C++:
#include<iostream>  
using namespace std;  
int main()  
{  
    int a ,b;  
    while(cin>>a>>b&&(a||b))  
    {  
        cout<<a+b<<endl;  
    }  
    return 0;  
}  


5. 利用文件重定向提高调试效率
  编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是ACM竞赛实战,这些都是可以避免的。方法是,运用重定向。
  用下面的形式调用函数freopen()会将标准输入stdin重定向到文件input.txt(这个名字可以自己定义)。

  重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取input.txt读取,这就是重定向。


C:
#include<stdio.h>  
int main()  
{  
    freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt  
    int a,b;  
    scanf("%d%d",&a,&b);  
    printf("%d\n",a+b);  
    return 0;  
}  



C++:
#include<iostream>  
#include<fstream>  
using namespace std;  
int main()  
{  
    ifstream fin("input.txt");  //只加这一句输入将被重定向到文件input.txt  
    int a,b;  
    fin>>a>>b;  
    cout<<a+b<<endl;  
    fin.close(); //记得关掉
    return 0;  
}  



  
于是,在运行程序前,将本该由键盘输入的数据,写到文件input.txt中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。
  需要注意的是,调试通过的程序,千万不要直接提交到OJ平台上去。如果竞赛中这样做了,罚你的20分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得AC的程序。
  除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。


文章来源:
               ACM题目中输入数据的处理(C++版),见:http://blog.youkuaiyun.com/sxhelijian/article/details/8978850
               ACM题目中输入数据的处理(C语言版)见:http://blog.youkuaiyun.com/sxhelijian/article/details/8978794

### 关于东华大学OJ平台上的皇后问题 #### 背景介绍 N皇后问题是计算机科学中的经典回溯算法问题之一。该问题的目标是在 \( N \times N \) 的棋盘上放置 \( N \) 个皇后,使得任意两个皇后都不能互相攻击[^1]。这意味着任何两个皇后都不可以位于同一行、列或对角线上。 #### 解题思路概述 解决N皇后问题的核心方法通常是基于 **回溯法** 实现的。以下是具体的实现逻辑: - 使用一个数组 `queen` 来记录每一行中皇后的具体位置,其中索引表示行号,而值则代表对应的列号。 - 对每行尝试不同的列来安放皇后,并通过辅助函数验证当前摆放是否合法。 - 如果当前位置不冲突,则继续处理下一行;如果所有可能的位置都已尝试完毕仍无法满足条件,则返回到前一层重新选择其他可能性。 ```python def solve_n_queens(n): solutions = [] board = [-1] * n def is_safe(row, col): for i in range(row): if board[i] == col or \ abs(board[i]-col) == abs(i-row): return False return True def backtrack(row): if row == n: solution = [['.' for _ in range(n)] for _ in range(n)] for r in range(n): solution[r][board[r]] = 'Q' solutions.append([''.join(row) for row in solution]) return for col in range(n): if is_safe(row, col): board[row] = col backtrack(row + 1) backtrack(0) return solutions ``` 上述代码片段展示了如何利用递归与回溯技术求解8皇后问题一个实例[^2]。此程序定义了一个名为`solve_n_queens`的功能模块,它接受参数n作为输入输出所有的解决方案列表。 #### 特定于东华大学OJ的情况分析 对于特定学校如东华大学所提供的在线评测系统(OJ),其针对皇后问题设置的具体题目可能会有额外约束或者变体形式的要求。例如,某些版本可能仅需计算可行配置的数量而非枚举全部布局方案;还有可能是限定时间复杂度下的优化解答需求等等。因此,在实际操作过程中应当仔细阅读相应试题描述以确认确切的任务目标以及评判标准[^3]。 #### 结论 综上所述,采用回溯策略能够有效应对各类变形后的N皇后挑战项目。当面对不同教育机构所提出的相似主题练习时,理解基础原理的同时也要注意适应特殊规则的变化调整自己的编程实践方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值