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],就是说只允许20个测试样例,然而zoj中的测试样例可能有数万个,所以建议改成在while里面直接输出。
如果不管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中。最终就可以得到你的代码的失败样例。追问

您好 刚才看错了 我想知道 你的算法的 讲解~ 能讲解下吗?
用你的 测试数据 我知道了 我错误的 地方不过 不清楚 大概那个方面错了
我想听听你的 算法 在看看我的来找出错误~
谢谢你啊~ 为了这题用了很多心吧~ 感谢~!

参考技术A 运行是错的追问

给我例子~ 我好检查下 哪里出错了 谢谢

追答

就是它上面的那个第一个例子,你的运行结果为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道题 程序问题的主要内容,如果未能解决你的问题,请参考以下文章

ZOJ1002 —— 深度优先搜索

ZOJ 1002 DFS

B - Problem Arrangement ZOJ - 3777

ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)

NOIp Graph 1002 瞎眼记

ZOJ-3777-Problem Arrangement(状态DP)