ZOJ 1002道题 程序问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ 1002道题 程序问题相关的知识,希望对你有一定的参考价值。
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 网址
这里的 第1002道题
我的代码为:
#include <stdio.h>
int main()
int n,t,i,j,a,b,c,d,k=0,e,f;
int m[20],max;
for(i=0;i<20;i++)
m[i]=0;
char s[20][20];
char T[20][20];
while(scanf("%d",&n) !=EOF&&n!=0&&n<=4)
max=0;
for(i=0;i<n;i++)
scanf("%s",T[i]);
for(e=0;e<n;e++)
for(f=0;f<n;f++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
s[i][j]=T[i][j];
if(s[e][f]!='X')
s[e][f]='d';m[k]=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(s[i][j]=='.')
t=0;
for(a=i;a<n&&t!=1&&t!=2;a++)
if(s[a][j]=='d') t=1;
if(s[a][j]=='X') t=2;
for(c=i;c>=0&&t!=1&&t!=3;c--)
if(s[c][j]=='d')
t=1;
if(s[c][j]=='X') t=3;
for(b=j;b>=0&&t!=1&&t!=4;b--)
if(s[i][b]=='d')
t=1;
if(s[i][b]=='X') t=4;
for(d=j;d<n&&t!=1&&t!=5;d++)
if(s[i][d]=='d')
t=1;
if(s[i][d]=='X') t=5;
if(t==0||t!=1)
s[i][j]='d'; m[k]++;
if(m[k]>max)
max=m[k];
m[k]=max;
k++;
for(i=0;i<k;i++)
printf("%d\n",m[i]);
return 0;
在我的机器上运行 没有找出任何错误 在网站上 说是 Wrong Answer
实在不知道 哪里出了错误 请高手 帮忙查看下!!! 分数不是 问题!!!
我的程序是 起初输如 n 的值 判断 n是否 大于 0 小于五
然后用 穷举法 从每一个 不是X 的点 放置堡垒 以d 为标示 然后开始 计算能放的堡垒的数目 利用 for循环来 分别试出 从上开始找 有没有d 或者x 如果有 d 直接跳出再找下一个点 如果有x 那就换下 下完了 就左右... 这样把这个数 弄到MAX 上
然后 在把d 放到 另一个 不是X 的点上 再试 依次 判断 弄到 MAX 值为最大
然后输出的~
我用了很多数据 但是 不知道 那地方错误了 请提示下
我不想要正确答案 我想要我的那里错了 ~!!!
分不是为题~ 谢谢!!!
如果不管m[20]的问题,你的算法可以举两个反例如下:
3
...
..X
.X.
3
...
..X
.XX
正确答案应该是4 3, 而你的输出是3 2.
事实上,所有的测试数据总共有2^1 + 2^4 + 2^9 + 2^16 大约7万个左右,我通过如下一段代码生成所有的测试数据:
/*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
char A[4][4];
int n;
FILE *pFile;
void output(int i, int j)
int pi,pj;
if(i==n-1 && j==n-1)
A[i][j]='.';
fprintf(pFile,"%d\n",n);
for(pi=0; pi<n; pi++)
for(pj=0; pj<n; pj++)
fprintf(pFile,"%c",A[pi][pj]);
fprintf(pFile,"\n");
A[i][j]='X';
fprintf(pFile,"%d\n",n);
for(pi=0; pi<n; pi++)
for(pj=0; pj<n; pj++)
fprintf(pFile,"%c",A[pi][pj]);
fprintf(pFile,"\n");
else
A[i][j]='.';
if(j<n-1)
output(i,j+1);
else if(i<n-1)
output(i+1,0);
A[i][j]='X';
if(j<n-1)
output(i,j+1);
else if(i<n-1)
output(i+1,0);
int main()
pFile = fopen("Test.txt","w");
for(n=1; n<=4; n++)
output(0,0);
n=0;
fprintf(pFile,"%d\n",n);
fclose(pFile);
return 0;
/******************************************************************************************/
生成的数据存储在Test.txt中,然后我自己写过一段该题目的正确代码,如下:
/***************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
int n,m,pi,pj;
int b[4][4];
void num()
int p_i,p_j,i,j;
for(p_i=0;p_i<n;p_i++)
for(p_j=0;p_j<n;p_j++)
if(b[p_i][p_j]>=0)
b[p_i][p_j]=0;
for(i=p_i,j=p_j-1;j>=0&&b[i][j]!=-1;j--)
if(b[i][j]!=-3)
b[p_i][p_j]++;
for(i=p_i,j=p_j+1;j<n&&b[i][j]!=-1;j++)
if(b[i][j]!=-3)
b[p_i][p_j]++;
for(i=p_i-1,j=p_j;i>=0&&b[i][j]!=-1;i--)
if(b[i][j]!=-3)
b[p_i][p_j]++;
for(i=p_i+1,j=p_j;i<n&&b[i][j]!=-1;i++)
if(b[i][j]!=-3)
b[p_i][p_j]++;
void FindMin()
int i,j,minimal=100;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(b[i][j]<minimal&&b[i][j]>=0)
minimal=b[i][j];
pi=i;
pj=j;
for(j=pj+1;j<n&&b[pi][j]!=-1;j++)
if(b[pi][j]>=0)
b[pi][j]=-3;
for(j=pj-1;j>=0&&b[pi][j]!=-1;j--)
if(b[pi][j]>=0)
b[pi][j]=-3;
for(i=pi+1;i<n&&b[i][pj]!=-1;i++)
if(b[i][pj]>=0)
b[i][pj]=-3;
for(i=pi-1;i>=0&&b[i][pj]!=-1;i--)
if(b[i][pj]>=0)
b[i][pj]=-3;
int isfull()
int i,j;
int is=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(b[i][j]>=0)
is=0;break;
return is;
void count()
while(!isfull())
num();
FindMin();
b[pi][pj]=-2;
m++;
int main()
int i,j;
char c;
scanf("%d",&n);
while(n)
c=getchar();
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c=getchar();
if(c=='X') b[i][j]=-1;
else if(c=='.') b[i][j]=0;
c=getchar();
m=0;
count();
printf("%d\n",m);
scanf("%d",&n);
return 0;
/**************************************************************************************************/
我把你的代码编译生成exe文件: 1.exe
再把我的代码编译生成exe文件: 2.exe
然后把两个exe以及Test.txt放到一个文件夹,创建批处理文件cmp.bat,内容如下:
1.exe<Test.txt>out1.txt
2.exe<Test.txt>out2.txt
fc out1.txt out2.txt >result.txt
大意是以Test.txt为输入分别生成输出out1.txt和out2.txt,然后通过C:\Windows\System32下的工具fc.exe比较out1.txt和out2.txt的内容,将不同的部分列出输出到result.txt中。最终就可以得到你的代码的失败样例。追问
您好 刚才看错了 我想知道 你的算法的 讲解~ 能讲解下吗?
用你的 测试数据 我知道了 我错误的 地方不过 不清楚 大概那个方面错了
我想听听你的 算法 在看看我的来找出错误~
谢谢你啊~ 为了这题用了很多心吧~ 感谢~!
给我例子~ 我好检查下 哪里出错了 谢谢
追答就是它上面的那个第一个例子,你的运行结果为4,实际是5
追问...请问 你读懂题目了吗?
那个是 输入 大写 X 不是 小写的... 请你在试试 用大写
http://hi.baidu.com/weisu_star/blog/item/38c8ca123f9529cbc2fd782c.html
追问我想知道我的程序 哪方面错误 不想要正确答案...
1006.ZOJ问题
题目描述:
对给定的字符串(只包含‘z‘,‘o‘,‘j‘三种字符),判断他是否能AC。
是否AC的规则如下:
1. zoj能AC;
2. 若字符串形式为xzojx,则也能AC,其中x可以是N个‘o‘ 或者为空;
3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个‘o‘或者为空;
输入:
输入包含多组测试用例,每行有一个只包含‘z‘,‘o‘,‘j‘三种字符的字符串,字符串长度小于等于1000。
输出:
对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。
样例输入:
zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo
样例输出:
Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer
#include<iostream> using namespace std; int main(){ string s; while(cin>>s){ bool flag=true; int pos=s.find(‘z‘); int i; for(i=0;i<pos;i++){ if(s[i]!=‘o‘) flag=false; } int pos1=s.find(‘j‘); for(i=pos1+1;i<s.size();i++){ if(s[i]!=‘o‘) flag=false; } if((s.size()-pos1-1)!=pos) flag=false; int num=0; for(i=pos+1;i<pos1;i++){ if(s[i]!=‘o‘) flag=false; else num++; } if(num==0) flag=false; if(flag) cout<<"Accepted"<<endl; else cout<<"Wrong Answer"<<endl; } return 0; }
以上是关于ZOJ 1002道题 程序问题的主要内容,如果未能解决你的问题,请参考以下文章
B - Problem Arrangement ZOJ - 3777