A题:
水。。直接代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
string save[1010];
int main(){
int n,i,j;
scanf("%d",&n);
string t;
int flag = false;
for(i=1;i<=n;i++){
cin>>save[i];
if((save[i][0]=='O'&&save[i][1]=='O')||(save[i][3]=='O'&&save[i][4]=='O')){
if(!flag){
if(save[i][0]=='O'&&save[i][1]=='O'){
save[i][0]='+';
save[i][1]='+';
}else{
save[i][3]='+';
save[i][4]='+';
}
}
flag = true;
}
}
if(flag){
printf("YES\n");
for(i=1;i<=n;i++){
cout<<save[i]<<endl;
}
}else{
printf("NO\n");
}
return 0;
}
B题:
题目给一个n*n的矩阵,其中某个位置的数为0,这事我们要填的位置,保证其它位置的数字都为正整数。我们填的数字也必须为正整数,填上数字后要求这个矩阵每一行、每一列、两条对角线的的和要想等,如果不存在这样的数字,就输出-1。
题意很明确。。。是自己的编码能力不足。。。
首先先检查除去含零的列和行还有对角线是否相等,如果不等则直接判-1.
然后随便找一行来对比含0行找出要填的数字,填上后再检查一遍这个矩阵是否合法
。。。。感觉自己好腊鸡啊。。什么时候div能稳做三题呢。。
下面代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=510;
const long long prime = 10000019;
int n,i,j;
long long save[maxn][maxn];
bool judge(){
long long now=0,sum=0;
bool flag = true;
bool can=true;
for(i=1;i<=n;i++){
if(can){
now = sum;
}
sum = 0;
can = true;
for(j=1;j<=n;j++){
if(save[j][i]==0){
can = false;
}
sum = (sum+save[j][i])%prime;
}
if(can){
if(now!=sum&&now!=0){
flag =false;
return false;
}
}
}
return true;
}
long long result(int i0){
int it;
if(i0>1){
it=1;
}else if(i0==n){
it = 1;
}else{
it = n;
}
long long add=0;
for(i=1;i<=n;i++){
add += save[it][i]-save[i0][i];
}
return add;
}
int main(){
scanf("%d",&n);
int i0,j0;
if(n==1){
printf("1\n");
return 0;
}
long long now=0,sum=0;
bool flag = true;
bool can=true;
for(i=1;i<=n;i++){
if(can){
now = sum;
}
sum = 0;
can = true;
for(j=1;j<=n;j++){
scanf("%I64d",&save[i][j]);
if(save[i][j]==0){
i0=i,j0=j;
can = false;
}
sum = (sum+save[i][j])%prime;
}
if(can){
if(now!=sum&&now!=0){
flag =false;
}
}
}
if(flag){
long long sum1 = 0;
long long sum2 = 0;
bool can=true;
for(i=1;i<=n;i++){
if(save[i][i]==0){
can =false;
break;
}
sum1 = (sum1+save[i][i])%prime;
}
for(i=1;i<=n;i++){
if(save[i][n-i+1]==0){
can =false;
break;
}
sum2 = (sum2+save[i][n-i+1])%prime;
}
if(sum1!=sum2&&can){
printf("-1\n");
}else if(sum1!=now&&can){
printf("-1\n");
}else{
if(judge()){
if(result(i0)>0){
long long answer = result(i0);
save[i0][j0]=result(i0);
sum1=0,sum2=0;
for(i=1;i<=n;i++){
sum1 = (sum1+save[i][i])%prime;
sum2 = (sum2+save[i][n-i+1])%prime;
}
if(n==2){
if(sum1==sum2&&judge()){
if(answer>0){
printf("%I64d\n",answer);
return 0;
}else{
printf("-1\n");
}
}
}
if(sum1==sum2&&sum1==now&&judge()){
if(answer>0){
printf("%I64d\n",answer);
}else{
printf("-1\n");
}
}else{
printf("-1\n");
}
}else{
printf("-1\n");
}
}else{
printf("-1\n");
}
}
}else{
printf("-1\n");
}
return 0;
}